我在我的应用程序中使用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"的帖子,其回答如下:
键值编码无法做到这一点。您将需要映射
整个数组,然后访问第一个元素(也许通过
便捷方法)