核心数据与用于核心数据的单个 MOC 和主线程合并冲突

Posted

技术标签:

【中文标题】核心数据与用于核心数据的单个 MOC 和主线程合并冲突【英文标题】:core data giving merge conflict with single MOC and main thread used for core data 【发布时间】:2011-05-05 13:38:18 【问题描述】:

我正在使用带有单个 NSManagedObjectContext 的核心数据,并且正在对主线程上的核心数据执行所有操作。错误描述中给出的新行和旧行是相同的,希望有人能解释为什么会出现合并冲突。将合并策略设置为覆盖会导致应用在模拟器中运行到高 CPU 并变得无响应。

但是,当我尝试更新一个实体中的托管对象时,应用程序崩溃并出现以下错误,

NSMergeConflict (0x7144390) for NSManagedObject (0x7225db0) with objectID '0x721c0a0 <x-coredata://94349DC2-C441-4102-9C65-60737E940135/Locations/p1>' with oldVersion = 2 and newVersion = 3 and 
old cached row = \n    AccountInfo = \"0x721bae0 <x-coredata://94349DC2-C441-4102-9C65-60737E940135/Account/p1>\";\n    City = \"<null>\";\n    Country = \"Russian Federation\";\n    EntryStatusId = \"<null>\";\n    ExitStatusId = \"<null>\";\n    IsCorporateLocation = 1;\n    IsVisible = 1;\n    Latitude = 50;\n    LocationId = 10003;\n    Longitude = 40;\n    Name = \"Test Location\";\n    Radius = 304;\n    State = \"Province of Voronezh\";\n    Street = \"<null>\";\n    Units = METER;\n    Zip = \"<null>\";\n and 
new database row = \n    AccountInfo = \"0x7144560 <x-coredata://94349DC2-C441-4102-9C65-60737E940135/Account/p1>\";\n    City = \"<null>\";\n    Country = \"Russian Federation\";\n    EntryStatusId = \"<null>\";\n    ExitStatusId = \"<null>\";\n    IsCorporateLocation = 1;\n    IsVisible = 1;\n    Latitude = 50;\n    LocationId = 10003;\n    Longitude = 40;\n    Name = \"Test Location\";\n    Radius = 304;\n    State = \"Province of Voronezh\";\n    Street = \"<null>\";\n    Units = METER;\n    Zip = \"<null>\";\n

更新:如果我在更新每个对象后保存 MOC,则不会发生错误,但如果我更新所有对象然后保存 MOC,则会发生错误。有谁知道为什么会这样?

【问题讨论】:

感谢您的更新!我面临同样的问题,这解决了它。我现在使用 refreshObject 在保存上下文后更新对象,并且不再出现冲突。 【参考方案1】:

该错误表明您确实有两个独立的上下文。只有当您有两个或更多上下文写入同一存储时,您才会获得合并。

我建议在每次保存之前记录上下文,无论您在何处执行保存,以确保您只有一个活动上下文。

【讨论】:

这是我尝试的第一件事(即使我通过单例访问 MOC)并且没有看到正在记录不同的 MOC。事实上,我清理了对象,然后运行了两次相同的代码。第一次插入对象时一切正常,但第二次发生更新时,应用程序因同样的错误而崩溃。【参考方案2】:

可以让 Core Data 自动处理这种冲突,而不是抛出异常。看到这个帖子:http://pauloliveira.net/tech/core-data-merging-conflicts

【讨论】:

根据常见问题解答,您需要披露所提供的链接指向您的网站。另外,请总结链接的内容,而不是仅仅提供链接。

以上是关于核心数据与用于核心数据的单个 MOC 和主线程合并冲突的主要内容,如果未能解决你的问题,请参考以下文章

核心数据更改不合并

应用程序设计:处理带有背景上下文的核心数据;合并由 MOC 过滤的通知

核心数据 - 在多个线程之间共享 NSManagedObjects

核心数据 MOC 保存暂停执行并且无法保存(无错误或崩溃)

由于验证规则上下文导致的 iOS 核心数据保存 MOC 问题

核心数据多线程:代码示例