我在我的应用程序中使用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的新子类。
如果需要,我可以提供更多信息。
答案 0 :(得分:2)
您发布的JSON以taskNote
为数组,这意味着您的api没有更改其结构。它仍然返回相同的数组,其中包含一个对象。所以你有两个选择:
taskNote
转换为api中的对象。在这种情况下,您将获得taskNote
没有方括号
[]
。这意味着它不会是一个阵列。taskNote
作为数组放入xcdatamodel和.h文件中,映射
正如您所做的那样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"的帖子,其答案如下:
使用键值编码无法做到这一点。你需要映射 整个数组然后访问第一个元素(也许通过一个 便利方法)