我在我的应用程序中使用Restkit。我在映射一对一关系时遇到问题。

我有两个实体Task和TaskNote。以前,Task和TaskNote之间存在一对多的关系,即一个任务可以有很多注释。

这段代码工作正常

    NSDictionary *taskNoteObjectMapping = @{
                                        @"noteID" : @"noteID",
                                        @"taskID" : @"taskID",
                                        @"time_stamp" : @"time_stamp",
                                        @"noteText" : @"noteText",
                                        @"note_user_phone_no" : @"note_user_phone_no",
                                        @"note_username" : @"note_username"
                                        };

RKEntityMapping *taskNoteEntityMapping = [RKEntityMapping mappingForEntityForName:@"TaskNote" inManagedObjectStore:managedObjectStore];
[taskNoteEntityMapping addAttributeMappingsFromDictionary:taskNoteObjectMapping];
taskNoteEntityMapping.identificationAttributes = @[@"noteID"];


[taskEntityMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"taskNote" toKeyPath:@"taskNote" withMapping:taskNoteEntityMapping]];


但是由于某些要求,我必须在任务与其笔记之间将一对多关系更改为一对一关系,即一个任务可以有一个笔记。更改之后,我的映射开始失败。即当我使用NSLog观察Task与其Note的关系时,结果为零。和RestKit记录此错误

    Failed transformation of value at keyPath 'taskNote' to representation of type 'TaskNote': Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3002 "Failed transformation of value '(
    "<TaskNote: 0x17833a60> (entity: TaskNote; id: 0x17833aa0 <x-coredata:///TaskNote/t33EC8AB0-1E62-4041-8B91-4B57BC0474F74> ; data: {\n    noteID = 113;\n    noteText = \"Note from server\";\n    \"note_user_phone_no\" = \"+923335729486\";\n    \"note_username\" = Myself;\n    task = nil;\n    taskID = 248;\n    \"time_stamp\" = 14130583;\n})"
)' to TaskNote: none of the 2 value transformers consulted were successful." UserInfo=0x166ba240 {detailedErrors=(
    "Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3002 \"The given value is not already an instance of 'TaskNote'\" UserInfo=0x16628750 {NSLocalizedDescription=The given value is not already an instance of 'TaskNote'}",
    "Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3000 \"Expected an `inputValue` of type `NSNull`, but got a `__NSArrayM`.\" UserInfo=0x166ba1e0 {NSLocalizedDescription=Expected an `inputValue` of type `NSNull`, but got a `__NSArrayM`.}"


要映射的JSON格式为

 "tasks":[
     {
        "taskID":248,
        "listID":388,
        "taskName":"Cure",
        "taskSyncStatus":1,
        "taskState":0,
        "task_latitude":0,
        "task_longitude":0,
        "taskLog":[  ],
        "taskComment":[  ],
        "taskNote":[
           {
              "noteID":113,
              "taskID":248,
              "noteText":"Note from server",
              "note_user_phone_no":"+10001234567",
              "note_username":"Myself",
              "time_stamp":14130583
           }
        ]
     }


请在这里指导我在做什么错。如何将一对一映射到关系上。更改模型后,我还生成了实体Task和TaskNote的新子类。

如果需要,我可以提供更多信息。

最佳答案

您发布的JSON具有taskNote作为数组,这意味着您的api并未更改其结构。它仍然返回带有一个对象的相同数组。因此,您有两个选择:


推荐:将taskNote从api转换为对象。在这种情况下,您将获得不带方括号的taskNote
[]。这意味着它不会是数组。
将xccdatamodel和.h文件中的taskNote作为数组,将
taskNote,就像已经在做的那样,并向其中添加一个辅助方法
返回数组的第一项作为任务注释。


看一下Wain中有关仅在此处映射第一个对象的答案:RestKit 0.22 : how to map only firstObject of an array

这是Google网上论坛上另一篇标题为"map first element from JSON array to single value using keypath mapping"的帖子,其回答如下:


  键值编码无法做到这一点。您将需要映射
  整个数组,然后访问第一个元素(也许通过
  便捷方法)

10-08 12:09