在 iOS Core Data 中映射嵌入对象

Posted

技术标签:

【中文标题】在 iOS Core Data 中映射嵌入对象【英文标题】:Mapping embedded objects in iOS Core Data 【发布时间】:2013-07-04 02:07:15 【问题描述】:

假设有一个 Web 服务返回如下 JSON 响应:


   "id": "123",
   "name": "John Doe",
   "phone": 
      "country_code": "1",
      "area_code": "11",
      "number": "55544433"
   

这是描述一个 Person 实体,但在这个实体内部,有一个包含嵌入对象的 phone 属性。

Phone 不是实体,它没有被 id 引用,它完全包含在这个 Person 实体的范围内。但是,最好将它映射到我的代码中的电话@interface(例如,它可能有一个方法“formatAsString”,它返回如下格式的字符串:“+1 (11) 55544433”)

在将模型映射到 ios Core Data 时,我应该如何处理这种情况?

【问题讨论】:

【参考方案1】:

创建一个Person 实体,它与to-many 实体具有to-many(如果只有一个电话#,则为一对一)关系。Phone 实体将与 Person 实体具有一对一关系。 此外,它将具有您描述的内部结构(国家代码、区域代码、编号)。

您不需要 id 属性来创建 CoreData 实体。

您可以将关系设置为“级联”,这样当一个人被删除时,所有相关的电话号码都会被删除。

当您遍历 JSON 响应时,将“电话”键读入 Phone 实体,并将其 person 属性读入当前正在遍历的人。

【讨论】:

听起来正确。 id 是否完全可选,即使将实体保存到持久存储也是如此? (例如,我将 Person 及其电话一起保存)。谢谢! CoreData 不提供使给定属性唯一化的自动方式。唯一保证唯一的是托管对象的objectID 属性。 objectID 属性由 CoreData 管理,您无法自行更改。当您保存时,实体将被赋予一个永久的objectID,无论您在这些对象上设置的属性如何。 非常感谢,这很有帮助!

以上是关于在 iOS Core Data 中映射嵌入对象的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上使用 Core Graphics 在 PDF 中嵌入超链接

我应该如何释放一个嵌入的 Core Foundation 对象?

Restkit 映射 - 使用嵌入式对象/关系作为标识属性

AutoMapper,反向映射不适用于嵌入式对象?

什么是 Core Data 的 .omo 文件?是必需的吗?

Spring Data JPA 通过嵌入对象属性查找