【发布时间】:2013-08-06 21:32:32
【问题描述】:
我在映射特定 JSON 结构时遇到了问题,如下面的简化形式所示:
{"personDetails":{"eyeColor":"brown",
"height":"2m 12cm",
"specialRestrictions":null,
"person":{"personId":42,
"firstName":"Hummingbird",
"lastName":"Collins",
"dob":1360856245000,
"gender":"F",
"personCode":"8DECCC6D-68CA-47E1-AV7F-84C2039D517",
"isAdmin":false}
}
}
在这种情况下,我想使用"personId" 字段,甚至"person" 对象本身,作为我的"personDetails" 对象的主键。据我所知,没有办法做到这一点。我查看了RKConnectionDescription,但在这种情况下似乎不适用,因为整个对象都是嵌入的,而不仅仅是外键属性。
我基本上希望这种关系是一对一的,当我像这样调用我的服务时,
http://server/services/getPersonDetailsByID/42
细节可以映射并保留在 CoreData 中,覆盖之前保存的 Person 的 PersonDetails。目前,同一个Person在本地可以存在多个PersonDetails对象,因为没有密钥。
所以,我的问题是:可以设置 RestKit 映射来完成这个预期的行为吗?还是我需要自己处理删除任何过时的 CoreData 对象?
编辑: 这是我的映射当前的样子。
RKEntityMapping* personDetailsMapping = [RKEntityMapping mappingForEntityForName:
@"personDetails" inManagedObjectStore:objectManager.managedObjectStore];
[personDetailsMapping addAttributeMappingsFromArray:@[@"eyeColor", @"height",
@"specialRestrictions"]];
[personDetailsMapping addPropertyMapping:[RKRelationshipMapping
relationshipMappingFromKeyPath:@"person" toKeyPath:@"person"
withMapping:personMapping]]; // personMapping defined earlier
以下是我尝试添加标识属性的两种不同方法:
personDetailsMapping.identificationAttributes = @[@"person"];
和
personDetailsMapping.identificationAttributes = @[@"personId"];
在不同的时间,他们每个人都会抛出这样的错误:
Invalid attribute 'personId': no attribute was found for the given name in the 'PersonDetails' entity.
【问题讨论】:
-
您是否尝试将密钥路径添加为标识属性?否则,您可以设置映射以将人员 ID 复制到详细信息对象中。
-
我试过
personDetailsMapping.identificationAttributes = @[@"person"];和personDetailsMapping.identificationAttributes = @[@"personId"];,这两个都抛出了错误。有没有办法指定子对象的属性?以及如何设置映射以将属性复制到 Details 对象中,就像您说的那样? -
在这两种情况下,都使用密钥路径
person.personId。我还没有尝试过用于标识属性,但可以用于复制 id。 -
谢谢!我会尝试一下。我想我必须在 CoreData 中添加 personId 作为我的对象的属性,然后复制到该属性中。
-
是的,如果您选择复制选项,则需要添加一个属性。
标签: ios core-data restkit restkit-0.20