【问题标题】:iOS Core Data Wants All Relationships to be bi-directionaliOS Core Data 希望所有关系都是双向的
【发布时间】:2014-01-19 04:46:54
【问题描述】:

我是 iOS 编程新手,但从事 SQL 工作多年。我正在尝试使用 Core Data 来构建我的模型。按照教程,我为我的应用程序创建了一个架构,该架构涉及许多非双向的一对多关系。

例如,我有一个 Games 实体和一个 Player 实体。游戏包括玩家的集合。因为玩家可以参与多个游戏,所以反向关系没有任何意义,也不需要。

然而,当我编译我的应用程序时,我收到两种形式的一致性错误消息。一个说。

Game.players does not have an inverse; this is an advanced setting.

真的吗?这是一种足以获得警告信息的“高级”能力?我应该忽略这条消息,还是我实际上在这里做错了 Core Data 不打算做的事情?

另一个是 Misconfigured Property 形式并记录文本:

Something.something should have an inverse.

那它为什么会这样想呢?

我找不到任何模式来解释为什么它会选择一个错误消息而不是另一个错误消息。对于 iOS 新手的任何提示将不胜感激。

这是在 Xcode 5.0.2 下。

【问题讨论】:

标签: ios core-data


【解决方案1】:

Core Data 不是数据库。这是一个需要掌握的重要事实,否则您将与框架抗争很长时间。

核心数据是您的数据模型,它恰好作为其选项之一持久保存到数据库中。这不是它的主要功能,它是次要功能。

Core Data 要求/建议您使用反向关系,以便它可以检查引用完整性,而无需进行昂贵的维护。例如,如果您在 A 和 B 之间有一个单向方式(表示为 A --> B)并且您删除了 B,Core Data 可能需要遍历整个 A 表以查找对 B 的引用,以便清理它们。这是昂贵的。如果你有正确的双向关系(A B),那么 Core Data 就知道它需要接触哪些 A 对象以保持引用完整性。

这只是一个例子。

双向性不是必需,但推荐足够高,它确实应该被视为一项要求。 99.999% 的时间你都想要这种双向关系,即使你从不使用它。 Core Data 将使用它。

【讨论】:

  • 我认为这是对这个问题最好的直接答案。所以 Core Data 不是一个 SQL 数据库,不应该被这样对待。再次查看 Apple 文档后,它确实有一个关于“核心数据不是什么”的部分,但它并没有完全这样说。
【解决方案2】:

为什么不直接添加反比关系?它也可以是多对多的,你很可能最终会使用它——通常从关系的不同端获取请求或对象图导航工作得更快或更好。

Core Data 更喜欢您在两个方向上定义关系(因此会出现警告),这样做不会花费您任何费用,因此您也可以这样做。不要与框架对抗——核心数据不是 SQLLite “管理器”,它是一个对象图和持久性工具,可以使用 SQL 作为后端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多