Restkit 映射 - 使用嵌入式对象/关系作为标识属性
Posted
技术标签:
【中文标题】Restkit 映射 - 使用嵌入式对象/关系作为标识属性【英文标题】:Restkit Mapping - Use Embedded Object/Relationship As Identification Attribute 【发布时间】: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 作为我的对象的属性,然后复制到该属性中。
是的,如果您选择复制选项,则需要添加一个属性。
【参考方案1】:
添加密钥路径作为标识属性可能会起作用。我还没有真正尝试过,但关键路径在大多数地方都有效。
personDetailsMapping.identificationAttributes = @[ @"person.personId" ]
如果没有,您可以设置映射以将人员 ID 复制到详细信息对象中。您将需要添加一个新的持久属性,然后在映射中使用键路径:
@"personId" : @"person.personId"
【讨论】:
第二个解决方案对我有用,但第一个不起作用。显然,至少在这种情况下,RestKit 不能遍历关系来识别使用子对象的属性。 我也有同样的经历。第一个解决方案在 RestKit 中引发了一个无效的属性异常,例如“无效的属性 'primaryView.url':在 'Server' 实体中找不到给定名称的属性”。使用addAttributeMappingsFromDictionary
添加新属性效果很好。以上是关于Restkit 映射 - 使用嵌入式对象/关系作为标识属性的主要内容,如果未能解决你的问题,请参考以下文章