我是iOS编程新手,但多年来一直在做SQL。我正在尝试使用Core Data来构建我的模型。在教程之后,我为我的应用程序创建了一个模式,该模式涉及许多不是双向的一对多关系。
例如,我有一个游戏实体和一个玩家实体。游戏包括一系列玩家。因为玩家可以参与多个游戏,所以反向关系没有任何意义,也不需要。
然而,当我编译应用程序时,我会以两种形式获得一致性错误消息。一个人说。
Game.players does not have an inverse; this is an advanced setting.
真的?这是一个“高级”功能,足以获得警告信息?我应该忽略这个消息,还是我实际上在做错了,核心数据不是设计用的?
另一种形式为配置错误的属性并记录文字:
Something.something should have an inverse.
那为什么会这么想?
我找不到任何模式来解释为什么它会选择另一个错误消息。任何关于iOS newb的提示都将不胜感激。
这是在Xcode 5.0.2下。
答案 0 :(得分:10)
核心数据不是数据库。这是一个重要的事实,否则你将长期与框架作斗争。
核心数据是您的数据模型,它恰好作为其选项之一持久存储到数据库中。这不是它的主要功能,它是次要功能。
核心数据要求/建议您使用反向关系,以便在不需要昂贵维护的情况下保持参照完整性。例如,如果您在A和B之间有一个方向(表示为A - > B)并且您删除了B,则核心数据可能需要遍历整个A表以查找对B的引用,以便它可以清理它们。这很贵。如果您具有适当的双向关系(A< B> B),那么Core Data确切地知道它需要触摸哪些A对象以保持参照完整性。
这只是一个例子。
双向性不是必需,但推荐足够高,确实应该被视为一项要求。即使你从未使用它,99.999%的时间你想要这种双向关系。核心数据将使用它。
答案 1 :(得分:2)
为什么不添加反向关系?它也可以是多个,并且您最终可能会使用它 - 通常获取请求或对象图导航可以更快或更好地来自关系的不同端。
核心数据更倾向于您在两个方向上定义关系(因此警告)并且您无需花费任何成本,因此您也可以这样做。不要对抗框架 - 核心数据不是SQLLite“管理器”,它是一个对象图和持久性工具,可以使用SQL作为后端。