具有全局持久存储的基于核心数据文档的应用程序

Dal*_*zio 5 cocoa core-data objective-c document-based

我有一个基于文档的核心数据应用程序,它按原样运行.我想添加对全局持久性存储的支持来保存项目库.

我已经阅读了大部分相关文档,并了解我应该在托管对象模型中使用配置.我已经定义了两个配置:"DocumentConfiguration"和"LibraryConfiguration".文档配置中的实体仅在文档配置中,库配置中的实体仅在库配置中 - 即,没有重叠.

然后,文档会说"然后在创建协调器时使用此模型".但是我实际上并没有创建自己的持久存储协调器,因为我使用的是默认的NSPersistentDocument协调器.

关于如何最好地进行并帮助消除我可能遇到的任何误解的几个问题:

A.我是否会在NSPersistentDocument中获取NSPersistentStoreCoordinator,然后按以下方式添加新的持久性存储:

NSPersistentStoreCoordinator * coordinator = [[myDocument managedObjectContext] persistentStoreCoordinator];
[coordinator addPersistentStoreWithType:NSXMLStoreType 
    configuration:@"LibraryConfiguration" 
    URL:url 
    options:nil 
    error:&error];
Run Code Online (Sandbox Code Playgroud)

我认为这可能是一个问题,因为我没有在NSPersistentDocument的持久性存储协调器中提供其他配置定义("DocumentConfiguration"),因为我使用的是NSPersistentDocument提供的默认值.我猜它在保存文档的时候可能会使用nil.如果是这样,这会是一个问题吗?即,如果没有为所有持久性存储(在这种情况下为两个)定义相同的配置,协调器将如何知道哪个持久存储保存具有给定配置定义的实体?我能够在创建/保存之前设置NSPersistentDocument持久性存储的配置(到"Doc​​umentConfiguration")吗?来自NSPersistentDocument文档:

保存新文档会添加具有所选URL的默认类型的存储,并在上下文中调用save:.对于现有文档,save只在上下文中调用save :.

B.创建我自己的NSPersistentStoreCoordinator和NSManagedObjectContext实例,添加定义了配置的两个持久存储,然后使NSPersistentDocument使用这些NSPersistentStoreCoordinator和NSManagedObjectContext实例并释放旧实例会更好吗?如果是这样,我如何为addPersistentStoreWithType:...方法指定NSPersistentDocument的url?只有在保存无标题文档后,才会知道此URL.(测试一下,在第一次保存文档之前,似乎没有任何临时持久性存储(通过持久性存储协调器上的方法persistentStores).

C.或者最好不要单独留下NSPersistentDocument,并创建我自己的NSPersistentStoreCoordinator实例,我专门用于持久库存储和托管库对象模型?文档说NSPersistentStoreCoordinator的多个实例应该在多线程Core Data应用程序中使用,但我不需要多线程Core Data支持.是否需要有两个NSPersistentStoreCoordinator实例 - 一个用于库,一个用于文档(直觉说这不是必需的,可能不是正确的方法)?

有什么建议?

Dal*_*zio 1

我使用的效果很好的解决方案基于上面的 C)。我单独保留 NSPersistentDocument 及其持久性存储协调器,而是创建自己的 NSPersistentStoreCoordinator 实例,专门用于持久性库存储(全局存储)。

我可以将存储的配置设置为自定义值,以防我稍后希望有多个与此持久存储协调器关联的存储(例如“LibraryConfiguration”)。由于库存储由与 NSPersistentDocument 的持久存储协调器不同的持久存储协调器管理,因此我不需要担心为 NSPersistentDocument 的持久存储指定配置。