【问题标题】:RestKit Object Mapping Relationships without KVC没有 KVC 的 RestKit 对象映射关系
【发布时间】:2012-03-08 06:44:49
【问题描述】:

在阅读了 RestKit 的 Object Mapping-Guide on GitHub 之后,我的问题并没有消失,所以也许有人可以说 RestKit 是否可以处理以下想法。

有关系的实体

 Company 
 - unitID 
 - companyID
 - name
 - contacts* (Company -->> Contact | 1:n)

 Contact
 - unitID
 - companyID
 - contactID
 - lastName
 - firstName
 - account* (Contact >--> Company | 1:1)

JSON(公司)

 [
   {
      "unitID":"003CABD8DEB5DC13C",
      "companyID":"BSP-002999",
      "name":"Testcompany"
   }
 ]

JSON(联系人)

 [
   {
      "unitID":"DAC2ACCC125795D00",
      "companyID":"BSP-002999",
      "contactID":"CLP-015468",
      "firstName":"Mister",
      "lastName":"Wayne"
   }
 ]

由于限制,我无法将所属联系人嵌套到公司中(否则我不会写这个),所以我想在导入时映射数据时这样做。

问题

是否可以在导入时使用 RestKit 给定的方法将每个联系人映射到其所属公司(由属性 companyID 标识)?

如果没有,我想知道最好的解决方案。谢谢!


背景

在我第一次构建此应用程序时,我已将对象映射到给定实体(没有关系),并使用谓词 companyID = %@ 将所有所属联系人提取到公司。由于数据量很大(4000 多家公司,7000 多个联系人),获取所有相关联系人大约需要一秒钟 - 所以我想出了使用关系的想法(这与本地虚拟数据完美配合)。


解决方案

在下面给出的答案的帮助下,我当前的映射如下所示(RestKit v.10)。

// Setting up Restkit with objectStore
...

// Init objectMapping for Class Company
companyMapping = [RKManagedObjectMapping mappingForClass:[Company class] inManagedObjectStore:objectStore];
[companyMapping mapKeyPath:@"unitID" toAttribute:@"unitID"];
[companyMapping mapKeyPath:@"companyID" toAttribute:@"companyID"];
[companyMapping mapKeyPath:@"name" toAttribute:@"name"];
companyMapping.setDefaultValueForMissingAttributes = NO;
companyMapping.primaryKeyAttribute = @"companyID";

// Init objectMapping for Class Contact
contactMapping = [RKManagedObjectMapping mappingForClass:[Contact class] inManagedObjectStore:objectStore];
[contactMapping mapKeyPath:@"unitID" toAttribute:@"unitID"];
[contactMapping mapKeyPath:@"companyID" toAttribute:@"companyID"];
[contactMapping mapKeyPath:@"contactID" toAttribute:@"contactID"];
[contactMapping mapKeyPath:@"lastName" toAttribute:@"lastName"];
[contactMapping mapKeyPath:@"firstName" toAttribute:@"firstName"];
contactMapping.setDefaultValueForMissingAttributes = NO;
contactMapping.primaryKeyAttribute = @"contactID";

// Init relationships
[contactMapping mapRelationship:@"company" withMapping:companyMapping];
[contactMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

// Get objects from server
...

【问题讨论】:

  • 你能分享一下这个例子的工作解决方案吗? :) 仅用于映射
  • 用示例配置更新了我上面的条目。希望对您有所帮助!

标签: iphone core-data restkit relationships


【解决方案1】:

是的,RestKit 可以在映射时为您补充这种关系。在您的联系人模型的 RKManagedObjectMapping 上,您需要执行以下操作:

  • 添加到母公司的关系映射:[objectMapping mapRelationship:@"company" withMapping:companyMapping]
  • 将 companyID 属性映射到您的联系人模型中
  • 确保在两个类上都配置了 primaryKeyAttribute
  • 指示 RestKit 水合关系:[objectMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

RestKit 完成对有效负载的映射后,它将通过集合传回并水合任何关系。处理会延迟到映射之后,以防有效负载实际创建您需要满足连接的对象。

在开发分支上,您可以使用另一种工作流程。本周早些时候,我添加了对使用有效负载中的 ID 数组来水合 has-many 关系的支持。这将允许您将属于公司的联系人列表发送到有效负载中。它可能对您的用例更有效。

我在 RestKit 邮件列表中发布的其他详细信息:http://groups.google.com/group/restkit/msg/416951f86b2862d1

【讨论】:

  • 感谢您的快速回放 - 它就像一个魅力!我现在在 GitHub/Google 上看这个项目,因为你的第二个想法似乎对这个项目很好。
  • 你拯救了我的一天! :) 似乎您的实体中需要一个外键,该外键指向您想要水合的父实体。无论如何,我浏览了各种文档和示例,但我只是不明白它是如何工作的。这是迄今为止关于如何最终让这件事发挥作用的最佳解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
相关资源
最近更新 更多