从CoreData关系

时间:2016-10-11 16:30:55

标签: ios core-data

我有一个相当大的CoreData模型突然表现得很奇怪。有三个相关实体:

  • 用户
  • 故事

User包含一个名为storiesStory个对象的多对多关系,以及一个多对多关系groupsGroup个对象。两者也有适当的逆。我使用mogenerator为所有属性和关系生成方便的访问器。两者都被订购了许多关系。

现在有时会发生这种情况,当我向用户对象询问其groups(如user.groups)时,我实际上得到了一组NSOrdered的XNGStory对象。在我观察到的少数情况下,它们与user.stories返回的对象相同。这两组不是相同的(不同的指针),但它们的内容是(我通过调用array] valueForKeyPath:@"objectID.URIRepresentation"]检查它们并在两种情况下以相同的顺序获得相同的URI)。

感觉我的应用程序中存在某种方式存储groups关系中的故事,但我检查了代码,只有与组相关的类涉及groups关系而且只有与故事相关的类触及story - 关系。此外,它们之间没有任何交互或关系,它们在应用程序的完全独立部分中使用,因此我不知道这种数据损坏是如何发生的。

是否有任何理由可能导致此类数据损坏?当我意外地将对象存储在错误的关系中时,我本以为CoreData会抱怨。

还有一件事:到目前为止,我们只能在iOS 10上重现它。

我们尝试的事情:

  • 我们首先怀疑是一个内存问题(因为错误类型的对象出现了它不应该出现的地方),但是使用Address Sanitizer和NSZombies运行并没有发现任何问题。此外,一旦出现问题,它会继续通过应用程序重新启动并使用调试器在对象中查找也显示一致(错误的)数据模型,因此它不仅仅是一个指针错误。
  • 已取消激活WAL(问题仍然存在)
  • 在使用Core Data Editor崩溃后查看sqlite文件(有和没有WAL):它显示groups关系的组对象,所以在sqlite-database-level上似乎都很好 - >从文件加载时,关系会以某种方式混淆。

2 个答案:

答案 0 :(得分:2)

据我所知,这似乎是一个iOS 10漏洞。

我们对使用核心数据的应用程序有类似的问题 - 用户对象具有关系地址(对地址对象)和朋友(对其他用户对象)的关系。

出于某种原因,在iOS 10下,Core Data偶尔会选择在Friends关系中返回Address对象。

我们已经回归测试回到iOS 9,并且不会发生此问题。

Open Radar上有一个针对同一问题的开放式错误 - 26826183。有趣的是,我们只是开始在10.0.2下看到这个问题,但Radar报告是基于早期的iOS 10 Beta。

答案 1 :(得分:0)

我们对此进行了广泛测试,并得出结论,这是一个iOS 10错误。它似乎也与我们的任何代码无关,只与数据模型有关。我们能够在一个示例项目中使用我们的数据模型,Xcode 8的代码生成和iOS 10的新NSPersistentContainer重新创建问题(在使用mogenerator和“设置CoreData堆栈的旧方法”之前)。< / p>

要重现此问题,请执行以下操作:

  1. 在启动时,如果没有User - 对象,则创建一个User - 对象并向其添加10个Group个对象并保存。
  2. 然后在主要上下文中添加Story并保存。
  3. 杀死应用程序(通过iOS向上轻扫或只是在Xcode中按“停止”)
  4. 再次启动应用。在启动时,获取User对象,将Story对象添加到stories关系并保存。
  5. 检查背景或主要背景上的user.groups关系。它现在包含XNGStory个对象,但它仍然应该有XNGGroup个对象。
  6. 我用示例项目提交了Radar。 OpenRadar是here(没有示例项目,因为它包含我们的数据模型)。​​

    该问题似乎高度依赖于数据模型设置。它发生在我们的User实体上的全部关系被订购时。如果所有订单都已订购,则不会发生,如果两个或更多订单无序,也不会发生。