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 中,覆盖之前保存的 PersonPersonDetails。目前,同一个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 映射 - 使用嵌入式对象/关系作为标识属性的主要内容,如果未能解决你的问题,请参考以下文章

手动映射 JSON 对象时,RestKit 关系未映射

使用 RestKit 0.20 的对象映射关系

RestKit 将未嵌套关系映射到拥有对象

RestKit 使用指定的主键引用在默认关系中映射对象

restkit - 映射关系有问题......或其他东西

RestKit 对象映射:如何从键值映射到新对象/关系?