在 iOS 的 Core Data 中建模一对多关系

Posted

技术标签:

【中文标题】在 iOS 的 Core Data 中建模一对多关系【英文标题】:Modeling a one-to-many relationship in Core Data for iOS 【发布时间】:2011-06-17 04:36:13 【问题描述】:

我有两个实体:患者和检查点。 患者具有出生日期、姓名、ID 等属性。 Checkpoint有dateRecorded、身高、体重等属性。

您可能明白了——我希望有一组患者,然后每个患者都可以有与该患者相关的检查点。

在这两个实体上,我应该如何设置设置?设置如下:

为此,我查看了documentation,但我仍然感到困惑。我认为我想要的是一对多的关系(对于患者),但是我不确定如何为它们中的任何一个设置倒数,或者删除规则和其他东西。谢谢你!!

【问题讨论】:

【参考方案1】:

我这周刚开始使用 Core Data。好问题!

关系:

由于一个患者可以有多个检查点,Patient to Checkpoint 关系就是One to Many 关系。 “反向关系”的概念本质上是这样的:您有一个单向的关系(患者到检查点) - 现在继续从检查点的角度反向查看它。检查点只能应用于单个患者。因此,Checkpoint to Patient 关系是One to One 关系。

反向关系:

要处理逆关系,只需创建每个关系,忽略逆关系。然后,在每个对象上建立关系之后,继续将逆定义为另一个实体上的关系。

换句话说,关系指向另一个实体或一组实体。 反向关系指向另一个实体上的关系。

删除规则:

就删除规则而言,它相当简单。尝试删除具有检查点的患者时...

拒绝:Core Data 不允许您删除患者。 级联:Core Data 将删除实体(患者),以及通过关系级联并删除这些对象。 (换句话说,Core Data 也会删除 Checkpoint 对象。) 无效:Core Data 将删除患者,但首先删除关系。检查点将保持不变。

对于 Patient 实体,可能需要拒绝或级联,具体取决于您希望如何管理数据。根据您的用例,您可能不希望取消,因为检查点依赖于患者实体。

您希望检查点无效,因为级联会阻止您在不删除整个患者的情况下删除检查点,而拒绝将有效地强制执行相同操作。

【讨论】:

哇!!谢谢,我正在尝试。不过,我对倒数有点困惑。对于患者到检查点,是逆“检查点”吗?从 Checkpoint 到 Patient,倒数只是“Patient”,还是没有倒数?如果我理解你所说的,这两个值对于检查点和患者都是无效的。 其实,等一下,我自己也很困惑。但是,应该只有一个菜单选项是正确的。 “应该只有一个正确的菜单选项”是什么意思? 假设您在 Xcode 4 中。在没有指定反向关系的情况下创建两个关系后,反向下拉列表将填充一个选项。这些选项都是正确的。 查看我的编辑(“换句话说......”)。这可能更容易理解。【参考方案2】:

根据上述场景,患者表和检查点表之间看起来是一对多的关系。

现在添加从“Patient”到“Checkpoint”的关系,并设置表之间的逆向关系。

另外,将两个关系的删除规则设置为“级联”。这意味着,如果您使用 Patient 删除一个对象,则相应的 Coredata 也会删除关联的对象。

【讨论】:

以上是关于在 iOS 的 Core Data 中建模一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

IOS/objective-c/core-data:如何从相关实体获取属性

在 Core Data Editor 中建模 JSON 结果

ios Core Data 获取特定值

IOS - 如何在 Core Data Swift 中将数据插入到具有关系的不同表中

Core Data 上的一对多关系

在 Core Data 中有效地获取一对多关系中的最新记录