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:在保存文档之前合并两个上下文的主要内容,如果未能解决你的问题,请参考以下文章