核心数据与同一实体的多重关系

时间:2011-09-11 17:15:06

标签: ios core-data entity relationship

我现在一直在研究核心数据,现在我已经决定是时候在我正在做的新项目中使用它了。

从未在工作项目中使用它我只是遇到了一些问题,我希望得到社区的反馈。

我正在做一个基于位置的应用程序,我想在我的核心数据模型中存储“郊游”,所以对于每次旅行我都有一些传统信息,如日期,距离,描述等......但我也需要保存位置信息,我需要在地图上绘制一些点。

所以我每次旅行都有一个“to”和“from”对象,我创建了一个具有纬度,经度和位置名称属性的MapPoint实体。在我的Trip实体中,我添加了一个“to”和一个“from”关系,其目的地是MapPoint。

但是我如何处理逆属性呢?

因为Xcode似乎发出了警告,所以我把它留作“No inverse”。

我需要在MapPoint上创建2个关系,以引用返回到“to”的Trip和另一个引用Trip的“from”关系的关系。

这是对的吗?我不太明白。

我有一个与用户实体类似的问题,其中在其他几个实体中使用它,我是否应该将反向关系反馈给使用用户的每个实体?

为了让Xcode保持高兴,似乎我需要在用户上创建一个回到Trip的关系,然后回到我正在使用的其他实体,例如上传,图片实体等......在我看来,想到一个旅行令人不安有一个User对象,然后准备链接回上传/照片...这与该旅行无关。

3 个答案:

答案 0 :(得分:6)

如果要支持tofrom关系的反向关系,只需向MapPoint实体添加适当的关系即可。称他们为tripTotripFrom,或任何适合您的人,并将其设置为tofrom关系的反向关系。

正如文档解释的那样,您不需要在两个方向上建立关系模型,但这样做会让生活更轻松。例如,当用户被删除时会发生什么?如果您有许多与User相关的其他实体,那么您需要一些方法来确定哪些对象与该用户相关,以便您可以更新它们。如果您有反向关系,Core Data可以使用您选择的删除规则(如nullify)自动更新任何相关对象。如果没有反向关系,您可以自行修复任何相关对象。

答案 1 :(得分:3)

根据我的经验,Core Data并不“要求”您拥有反向关系,但不会让它们导致神秘的错误,即使如果你确保手动保持对象图一致。至少我认为这是造成神秘错误的原因。

SQLite存储使用反向关系来表示多对多关系。对于从实体A到实体B的多对多关系foo,我原以为它会创建一个单独的表“foo”,其中包含A列和B列,对象ID在A列中出现不止一次。它根本不代表一对多的关系,它只代表它们的反转,它们是一对一的关系。它将fooInverse表示为实体B表中的列,包含对应于A类实体的对象ID。所以你必须有逆。似乎在简单的情况下,如果你没有定义它,核心数据可以推断出反应应该是什么,并且你的to-many属性可以正常工作。然而,在更复杂的情况下,例如您描述的情况,它会失败。

答案 2 :(得分:2)

我并不完全熟悉Core Data,但我相信它有一种实体继承形式。

您可以将MapPoint实体抽象化,并创建FromMapPointToMapPoint,从MapPoint实体继承其属性。

您的Trip实体可以有两个不同的关系 - 一个到FromMapPoint,一个到ToMapPoint,并且有适当的反转。

正如我所说 - 我不是CD专家,所以希望有其他人可以来验证/拍下这个建议吗?

通过一些挖掘,我发现您可以通过数据模型检查器设置父实体。我创建了你所谈论的quick representation