RestKit一对一关系映射错误

时间:2015-03-03 09:11:02

标签: ios iphone restkit restkit-0.20 ios7.1

我在我的应用程序中使用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观察与其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的新子类。

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

1 个答案:

答案 0 :(得分:2)

您发布的JSON以taskNote为数组,这意味着您的api没有更改其结构。它仍然返回相同的数组,其中包含一个对象。所以你有两个选择:

  1. 推荐:将taskNote转换为api中的对象。在这种情况下,您将获得taskNote没有方括号 []。这意味着它不会是一个阵列。
  2. taskNote作为数组放入xcdatamodel和.h文件中,映射 正如您所做的那样taskNote并添加一个辅助方法 返回数组的第一项作为任务注释。
  3. 请查看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"的帖子,其答案如下:

      

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