我有一个相当大的CoreData模型突然表现得很奇怪。有三个相关实体:
User
包含一个名为stories
到Story
个对象的多对多关系,以及一个多对多关系groups
到Group
个对象。两者也有适当的逆。我使用mogenerator为所有属性和关系生成方便的访问器。两者都被订购了许多关系。
现在有时会发生这种情况,当我向用户对象询问其groups
(如user.groups
)时,我实际上得到了一组NSOrdered的XNGStory对象。在我观察到的少数情况下,它们与user.stories
返回的对象相同。这两组不是相同的(不同的指针),但它们的内容是(我通过调用array] valueForKeyPath:@"objectID.URIRepresentation"]
检查它们并在两种情况下以相同的顺序获得相同的URI)。
感觉我的应用程序中存在某种方式存储groups
关系中的故事,但我检查了代码,只有与组相关的类涉及groups
关系而且只有与故事相关的类触及story
- 关系。此外,它们之间没有任何交互或关系,它们在应用程序的完全独立部分中使用,因此我不知道这种数据损坏是如何发生的。
是否有任何理由可能导致此类数据损坏?当我意外地将对象存储在错误的关系中时,我本以为CoreData会抱怨。
还有一件事:到目前为止,我们只能在iOS 10上重现它。
groups
关系的组对象,所以在sqlite-database-level上似乎都很好 - >从文件加载时,关系会以某种方式混淆。 答案 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>
要重现此问题,请执行以下操作:
User
- 对象,则创建一个User
- 对象并向其添加10个Group
个对象并保存。 Story
并保存。User
对象,将Story
对象添加到stories
关系并保存。user.groups
关系。它现在包含XNGStory
个对象,但它仍然应该有XNGGroup
个对象。我用示例项目提交了Radar。 OpenRadar是here(没有示例项目,因为它包含我们的数据模型)。
该问题似乎高度依赖于数据模型设置。它发生在我们的User
实体上的全部关系被订购时。如果所有订单都已订购,则不会发生,如果两个或更多订单无序,也不会发生。