掌握CoreData(第5部分,核心数据中实体之间的关系)

出于本部分的目的,我们将扩展Todo应用程序。 最终应用将处理一对一一对多关系。 我们将在后面的部分中讨论“ 多对多”

示例项目中有三个实体

1.用户→这将是主要实体,与TaskPassport实体具有关系

2.任务→这将包含用户的Todo任务,与用户具有多对一关系

3.护照它将包含用户的护照信息,与用户具有一对一关系

这些都是到目前为止创建的所有实体,如图1,2和3所示。如果您不知道如何添加属性,请参阅第3部分。

创建关系时,您需要决定很多事情,这些选项在“ 数据模型”检查器选项卡的右侧,如图4所示。

  1. 您想与之建立关系的目标实体 →目标实体名称
  2. 基数 →关系是否是一对一,多对一
  3. 可选→关系可以为NULL / NOT NULL
  4. 瞬态 →内存使用率
  5. 限制 →如果是一对多,关系中是否存在最大或最小数量的对象? (下限不必为零)
  6. 方向 →大多数对象关系本质上是双向的 。 如果一个部门与一个部门中的员工有“到-许多关系”,则从员工到部门之间存在一对一的反向关系 。 推荐的方法是在两个方向上建模关系,并适当指定逆关系。 如果进行更改,Core Data将使用此信息来确保对象图的一致性
  7. 删除规则→关系的删除规则指定如果尝试删除源对象 ,应在目标实体上发生什么

拒绝 →如果关系目的地(员工)上至少有一个对象,请不要删除源对象(部门)。

Nullify →删除对象之间的关系,但不要删除任何一个对象。

级联 →删除源时,删除关系目标处的对象。

无操作 →对关系目标处的对象执行任何操作

“操作”规则可能没有用,因为如果使用该规则,则有可能使对象图处于不一致状态(员工与已删除部门有关系)。

一对一关系(用户→护照)

现在,我们创建用户与护照的关系。 用户可以拥有与其关联的一本护照。

转到用户实体→在“关系”上单击+,然后单击→添加关系详细信息,如图5所示。

对于逆关系,我们还需要在另一侧创建关系

转到“护照实体”→在“关系”上单击+,然后单击→添加关系详细信息,如图6所示。

现在我们需要确定删除规则。 如果删除了用户,则无需保留用户护照怎么办,因此我们将用户→护照删除规则设置为级联,如图7所示,这意味着在删除用户1时,核心数据会自动删除与用户1相关联的所有护照。

其次,我们选择“ 数据模型”检查器的“类型”点击上的“ 一对一因为用户→护照之间的关系是一对一

另一方面,如果我们删除Passport,用户仍然保留在数据库中,因此我们将Passport→User delete规则设为Nullify。 另外,由于关系是一对一的,因此我们在Type选项卡上选择To One ,如图8所示。

一对多关系(用户→任务)

现在,我们创建一个用户与任务的关系。 用户可以有多个与之关联的待办任务。

转到用户实体→在“关系”上单击+,然后单击→添加关系详细信息,如图9所示。

对于逆关系,我们还需要在另一侧创建关系

转到任务实体→在“关系”上单击+,然后单击→添加关系详细信息,如图10所示

现在转到用户实体和任务实体,然后选择反关系,如图11和12所示。

现在我们需要确定删除规则。 如果删除了用户该怎么办,则无需保留用户任务。 因此,我们使User→Task删除规则级联,如图13所示。对于基数,User可以有多个To-do Tasks。

转到用户实体→单击用户→任务关系→在右侧窗口中,选择数据模型检查器中“ 类型”选项卡上的“一对多 ”,如图13所示。

另一方面,如果我们删除Tasks,则用户仍然保留在数据库中,因此我们将Task→User delete规则设为Nullify ,如图14所示。为了基数,为简单起见,task只能与一个User相关联。

转到任务实体→单击任务→用户关系→在右侧窗口上,在数据模型检查器的“ 类型”选项卡上选择“一对一 ”,如图14所示。

由于我们向现有实体添加了新属性并还创建了一些新实体,因此我们需要使用Xcode的内置功能为现有实体再次生成类,以与第4部分中相同的方式生成类。需要通过执行以下操作来删除现有实体: 右键单击“类” →“ 删除”选择“移至阈值”

最后,为所有实体生成NSManagedObject类,如图15所示。

由于用户可以具有与其关联的多个任务。 我们可以在User类中看到它们是一个NSSet属性,它表示与用户相关联的任务数组。 Xcode还生成了一些基本的CRUD操作,如图15所示。

摘要

我们刚刚完成了如何在实体之间建立关系的工作。 我们还查看了创建关系所需的配置。

接下来是什么?

在下一部分中,我们将对这些具有面向对象样式关系的实体进行CRUD操作

有用的链接

https://hackernoon.com/core-data-relationships-d813ed66ba8c

https://stackoverflow.com/questions/26946192/how-to-add-attributes-to-a-core-data-class-created-with-the-data-model