CoreData:在保存文档之前合并两个上下文

Posted

技术标签:

【中文标题】CoreData:在保存文档之前合并两个上下文【英文标题】:CoreData: Merge two contexts before saving the document 【发布时间】:2010-05-23 13:22:04 【问题描述】:

我正在编写基于 Coredata 文档的应用程序(即 CoreData+NSPersistentDocument):当我创建一个新文档时,会初始化一个新的 coredata 堆栈,其中包含一个模型和一个托管上下文。

在用户保存文档之前,我需要做的是: - 创建一个新的上下文 - 在其中创建许多新的托管对象 - 合并两个上下文。

我发出 save: 在新上下文中,但它引发异常“此 NSPersistentStoreCoordinator 没有持久存储。它无法执行保存操作。”。

我该怎么办? 在此操作之前我是否需要保存文档?

顺便说一句,如果我保存文档,创建新上下文,导入数据并保存新上下文,最后保存文档上下文,我会收到以下消息:“此文档的文件已被另一个应用程序更改,因为您打开或保存它。";有什么想法吗?

最好的问候!

【问题讨论】:

【参考方案1】:

根本问题是NSPersistentDocument 进行原子保存,其中文档NSManagedObjectConext 被保存到一个临时文件,然后该文件与文档URL 上的文件(如果存在)进行原子交换。这种交换的时间是不公开的,这使得NSPersistentDocument 子类在保存操作期间几乎不可能知道(临时)持久存储的 URL。我相信您唯一的选择是覆盖-[NSPersistentDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:],以便在创建持久存储后保存新上下文。

作为参考,我已在 rdar://6510616 下使用 Apple 提交了此错误(请随时复制它以投票支持修复)。

【讨论】:

感谢您的回答,巴里。我通过在文档初始化时添加内存中持久存储来管理,以便不同的 NSManagedObjectContext 成功保存;在 writeToURL:ofType:forSaveOperation:originalContentsURL:error: 如果这是第一次保存,我会将此商店迁移到 sqlite 商店。

以上是关于CoreData:在保存文档之前合并两个上下文的主要内容,如果未能解决你的问题,请参考以下文章

不保存上下文的 CoreData 保存

将主上下文和私有上下文与 Core Data 合并

CoreData 合并冲突显示托管对象版本更改而不是数据

合并托管对象上下文的方法

多线程 CoreData 应用程序中主上下文和私有上下文的推荐合并策略

保存 CoreData 上下文和绑定问题