【问题标题】:POST Object with parent-child relationship using RestKIT使用 RestKIT 发布具有父子关系的对象
【发布时间】:2014-01-31 10:45:18
【问题描述】:

我正在使用 RestKit 使用以下行通过网络将数据发布到我的 Rest API:

        [[RKObjectManager sharedManager] postObject:list path:@"api/lists" parameters:nil
        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)

我要发布的对象list 具有名为tasks 的附加数据,它位于其他表中,即标准的一对多关系。现在,当我看到 POST 请求的日志时,它的正文仅包含 list 对象数据,如下所示

request.body={"listID":0,"listName":"List 3","listSyncStatus":false}

但没有相关的任务数据。我的问题是如何发布整个“列表”对象及其相关任务?谁能指导我正确的方法是什么?

我在app Delegate类中的Request Descriptor如下

    //INVERSE MAPPING TO PERFORM POST FOR LIST
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[listEntityMapping inverseMapping]
                                                                               objectClass:[List class]
                                                                               rootKeyPath:nil
                                                                                    method:RKRequestMethodPOST];

这是我的listEnityMapping

//LIST RELATED REQUESTS
NSDictionary *listObjectMapping = @{
                                      @"listID" : @"listID",
                                      @"listName" : @"listName",
                                      @"listSyncStatus" : @"listSyncStatus"
                                  };

RKEntityMapping *listEntityMapping = [RKEntityMapping mappingForEntityForName:@"List" inManagedObjectStore:managedObjectStore];
[listEntityMapping addAttributeMappingsFromDictionary:listObjectMapping];

listEntityMapping.identificationAttributes = @[ @"listID" ];

我确实有如下关系映射:

[listEntityMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"tasks"
                                                                                      toKeyPath:@"tasks"
                                                                                    withMapping:taskEntityMapping]];

我传入的 json 数据是这样格式化的

GET www.mydomain.com/api/lists

[ { "listID" : "96",
    "listName" : "List 1",
    "listSyncStatus" : "1",
    "tasks" : [ { "taskCompletionStatus" : "1",
          "taskID" : "67",
          "taskName" : "Task 2",
          "taskSyncStatus" : "1"
        },
        { "taskCompletionStatus" : "1",
          "taskID" : "66",
          "taskName" : "Task 1",
          "taskSyncStatus" : "1"
        }
      ]
  },
  { "listID" : "97",
    "listName" : "List 2",
    "listSyncStatus" : "1",
    "tasks" : [ { "taskCompletionStatus" : "1",
          "taskID" : "69",
          "taskName" : "Task 1",
          "taskSyncStatus" : "1"
        },
        { "taskCompletionStatus" : "1",
          "taskID" : "68",
          "taskName" : "Task 1",
          "taskSyncStatus" : "1"
        }
      ]
  }
]

记录跟踪 我正在了解可能是什么问题。 在执行发布之前出现以下日志跟踪

    Mapping values from object <List: 0xc1332a0> (entity: List; id: 0xc026ec0 <x-coredata://8F498A46-254D-49F3-BEF1-0B675E5AE9D9/List/p1> ; data: {
    listID = 0;
    listName = "List 1";
    listSyncStatus = 0;
    tasks =     (
        "0xc030f30 <x-coredata://8F498A46-254D-49F3-BEF1-0B675E5AE9D9/Task/p1>"
    );
}) ((null)) to object {
} with object mapping (null)

    2014-01-31 17:02:30.229 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'listID' to 'listID'
2014-01-31 17:02:30.230 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'listID' to 'listID'. Value: 0
2014-01-31 17:02:30.230 RKGist[2455:541f] D restkit.object_mapping:RKPropertyInspector.m:130 Cached property inspection for Class 'NSMutableDictionary': {
    fileHFSFlags =     {
        isPrimitive = 1;
        keyValueCodingClass = NSNumber;
        name = fileHFSFlags;
    };
    fileHFSResourceForkSize =     {
        isPrimitive = 1;
        keyValueCodingClass = NSNumber;
        name = fileHFSResourceForkSize;
    };
}

    2014-01-31 17:02:30.230 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'listName' to 'listName'
    2014-01-31 17:02:30.231 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'listName' to 'listName'. Value: List 1
    2014-01-31 17:02:30.231 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'listSyncStatus' to 'listSyncStatus'
    2014-01-31 17:02:30.231 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'listSyncStatus' to 'listSyncStatus'. Value: 0
    2014-01-31 17:02:30.232 RKGist[2455:70b] D 2014-01-31 17:38:29.514 RKGist[2686:70b] D 

restkit.network:RKObjectParameterization.m:128 Serialized __NSCFNumber value at keyPath to __NSCFBoolean (0)
2014-01-31 17:38:29.514 RKGist[2686:70b] D restkit.object_mapping:RKMappingOperation.m:1021 Finished mapping operation successfully...
2014-01-31 17:38:29.516 RKGist[2686:70b] T restkit.network:RKObjectRequestOperation.m:178 POST 'http://mydomain.com/api/lists':
request.headers={
    Accept = "application/json";
    "Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5";
    "Content-Type" = "application/json; charset=utf-8";
    "User-Agent" = "RKGist/1.0 (iPhone Simulator; iOS 7.0.3; Scale/2.00)";
}
request.body={"listID":0,"listName":"List 1","listSyncStatus":false}
2014-01-31 17:38:30.227 RKGist[2686:3603] T restkit.network:RKObjectRequestOperation.m:248 POST 'http://mydomain.com/api/lists' (200 OK / 1 objects) [request=0.7102s mapping=0.0012s total=0.7119s]:
response.headers={
    "Cache-Control" = "no-cache, no-store, must-revalidate";
    Connection = "Keep-Alive";
    "Content-Length" = 0;
    "Content-Type" = "application/json";
    Date = "Fri, 31 Jan 2014 12:38:30 GMT";
    "Keep-Alive" = "timeout=5, max=384";
    Server = Apache;
    "X-Powered-By" = "Fat-Free Framework";
}
response.body=
2014-01-31 17:38:30.228 RKGist[2686:70b] Success

即问题是使用此字典完成逆映射时找不到任何关系

  NSDictionary *listObjectMapping = @{
                                      @"listID" : @"listID",
                                      @"listName" : @"listName",
                                      @"listSyncStatus" : @"listSyncStatus"
                                  };

我的问题是应该将什么添加到此字典中,以便逆向映射与任务成功发生?目前列表元素已正确映射,但没有关联的任务。

【问题讨论】:

  • 应该颠倒的listEntityMapping是什么关系?您可能希望显式创建请求映射。
  • @Wain 为有问题的 listEnityMapping 添加了代码。
  • @Wain 添加了有问题的关系代码。
  • 这表明list 没有关联的任务,因为反向映射应该可以工作。打开跟踪日志,看看它说了什么。在映射开始之前调试以记录完整的list 对象。
  • @Wain 我无法理解您的建议,请详细说明。

标签: ios http-post restkit restkit-0.20


【解决方案1】:

根据提供的信息,您的问题是 listEntityMapping(或从它创建的逆映射)没有关系告诉 RestKit 它也需要映射连接的对象。

RestKit 仅适用于它被告知的键,因此您必须添加一个关系告诉 RestKit:

  1. 对象中的源键
  2. JSON 中的目标键
  3. 在为源键找到的内容上使用的映射

根据您的补充,您需要进一步调查。添加此代码:

RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);

这将产生大量的日志记录。在您发布时检查日志,它应该详细显示映射正在做什么。 tasks 是怎么说的?

另外,在发布之前调试list。它真的有任务吗?确定。

【讨论】:

  • 在我的问题中添加了帖子的日志级别跟踪/
  • 接下来的几行日志没有说明任务?字典不需要改变,关系需要存在于逆映射上。看起来应该已经...
  • 添加了完整的 POST 请求日志。检查一下
  • 由于某种原因,似乎没有考虑这种关系。您是否在任何地方看到类似Unable to generate inverse mapping for relationship 的日志?创建自定义请求映射,而不是使用逆向方法。
  • 在日志的开头(上面发布)它说((null)) to object { } with object mapping (null)是这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
相关资源
最近更新 更多