在 Core Data 中建模逆向关系

Posted

技术标签:

【中文标题】在 Core Data 中建模逆向关系【英文标题】:Modeling an inverse relationship in Core Data 【发布时间】:2012-06-18 17:03:39 【问题描述】:

Core Data 中的关系让我很困惑。我读了又读,但我就是不明白。我想我通常在阅读时感到沮丧并没有帮助。我想做一些非常简单的事情:

我有一个名为 Pictures 的实体和一个名为 User 的实体。我希望用户能够喜欢和标记图片中的其他人,所以每个Picture 实体都有两个关系:

图片实体:

UsersWhoLikedThePicture(对多):

Destination: User 
Inverse: Picture

UsersWhoAreTaggedInThePicture(对多):

Destination: User
Inverse: Picture

但这在使用中造成了如此多的混淆,我什至无法开始描述。这是不一致的。有人喜欢一张图片会导致他们作为标记用户被删除,喜欢一张图片会导致您对所有其他图片的喜欢被删除。啊,真是一团糟……我的结构看起来还好吗?我将如何建模?

【问题讨论】:

【参考方案1】:

除了Matthias Bauch的回答,我可以给你一些理解关系的提示。

首先,当您处理 Core Data 时,您必须考虑对象。通过这种抽象,您可以将模型视为一个图,其中节点是您在模型中创建的实体,而关系是这些实体之间的链接。

现在,关于关系,它们可以是不同的类型:一对一、一对多和多对多。根据您拥有的关系类型,您可以在对象图中创建不同的链接。例如,如果UserPicture 具有一对多关系,则意味着对象(NSManagedObject 类型)的每个实例都有指向不同Pictures 的链接。 User 用作源,Pictures 用作目标。

Core Data 使用反向关系来保持图形的一致性。特别是,当您处理删除规则时,它们很有用。

每个关系都有一个与之关联的删除规则。 级联意味着如果你删除一个对象,比如User,Core Data 会为你删除链接到它的对象(Pictures)。 拒绝不允许删除链接到 UserPictures。 Nullify 表示从PictureUser 的链接将被破坏。这并不意味着对象被删除。就对象图而言,这意味着您不再有这些对象之间的链接。 No Action 意味着源被删除,目标始终存在,并且它继续指向一个不再存在的对象。因此,与 Nullify 不同,您需要手动断开该链接。如果不是,您可能会有图表不一致。尽量避免这种关系。

如果你想知道其他事情,请告诉我。

编辑

查看Core Data Programming Guide Relationships section 了解更多信息。

【讨论】:

【参考方案2】:

我不知道这是否可能,但听起来您对两个关系使用了相同的反向目标。不要那样做。

正确的方法是这样的:

【讨论】:

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

我如何在 Core Data 中为球队、比赛和主客场球队关系建模?

在 Core Data Editor 中建模 JSON 结果

在 Data Vault 2.0 方法中建模 Salesforce 多态关系

不要 nil Core Data 反向关系

Core Data 中的排序顺序具有多重关系

Xcode Core Data 替代关系而不是通用类型的逆向关系