我现在一直在研究核心数据,现在我已经决定是时候在我正在做的新项目中使用它了。
从未在工作项目中使用它我只是遇到了一些问题,我希望得到社区的反馈。
我正在做一个基于位置的应用程序,我想在我的核心数据模型中存储“郊游”,所以对于每次旅行我都有一些传统信息,如日期,距离,描述等......但我也需要保存位置信息,我需要在地图上绘制一些点。
所以我每次旅行都有一个“to”和“from”对象,我创建了一个具有纬度,经度和位置名称属性的MapPoint实体。在我的Trip实体中,我添加了一个“to”和一个“from”关系,其目的地是MapPoint。
但是我如何处理逆属性呢?
因为Xcode似乎发出了警告,所以我把它留作“No inverse”。
我需要在MapPoint上创建2个关系,以引用返回到“to”的Trip和另一个引用Trip的“from”关系的关系。
这是对的吗?我不太明白。
我有一个与用户实体类似的问题,其中在其他几个实体中使用它,我是否应该将反向关系反馈给使用用户的每个实体?
为了让Xcode保持高兴,似乎我需要在用户上创建一个回到Trip的关系,然后回到我正在使用的其他实体,例如上传,图片实体等......在我看来,想到一个旅行令人不安有一个User对象,然后准备链接回上传/照片...这与该旅行无关。
答案 0 :(得分:6)
如果要支持to
和from
关系的反向关系,只需向MapPoint实体添加适当的关系即可。称他们为tripTo
和tripFrom
,或任何适合您的人,并将其设置为to
和from
关系的反向关系。
正如文档解释的那样,您不需要在两个方向上建立关系模型,但这样做会让生活更轻松。例如,当用户被删除时会发生什么?如果您有许多与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
实体抽象化,并创建FromMapPoint
和ToMapPoint
,从MapPoint
实体继承其属性。
您的Trip
实体可以有两个不同的关系 - 一个到FromMapPoint
,一个到ToMapPoint
,并且有适当的反转。
正如我所说 - 我不是CD专家,所以希望有其他人可以来验证/拍下这个建议吗?
通过一些挖掘,我发现您可以通过数据模型检查器设置父实体。我创建了你所谈论的quick representation。