使用全局持久化存储的Core Data文档型应用程序

5
我有一个基于文档的Core Data应用程序,目前已经可以使用。我想添加全局持久存储支持来保存项目库。
我已经阅读了大部分相关文档,并理解应该在托管对象模型中使用配置。我定义了两个配置:“DocumentConfiguration”和“LibraryConfiguration”。文档配置中的实体仅存在于文档配置中,而库配置中的实体仅存在于库配置中,即没有重叠。
然后文档中说“创建协调器时使用此模型”。但是,我实际上并没有创建自己的持久存储协调器,因为我正在使用默认的NSPersistentDocument协调器。
以下是一些关于如何最好地进行操作以及帮助澄清可能存在的任何误解的问题:
A. 我是否应该在NSPersistentDocument中获取NSPersistentStoreCoordinator,然后按照以下方式向其添加新的持久存储:
NSPersistentStoreCoordinator * coordinator = [[myDocument managedObjectContext] persistentStoreCoordinator];
[coordinator addPersistentStoreWithType:NSXMLStoreType 
    configuration:@"LibraryConfiguration" 
    URL:url 
    options:nil 
    error:&error];

我认为这可能会成为一个问题,因为我没有在NSPersistentDocument的持久化存储协调器中提供其他配置定义(“DocumentConfiguration”),而是使用NSPersistentDocument提供的默认值。我猜想,在保存文档时,它可能会使用nil。如果是这样,那么这会成为一个问题吗?也就是说,如果不为所有持久存储(在此情况下为两个)定义相同的配置,则协调器如何知道要使用哪个持久存储来保存具有给定配置定义的实体?在创建/保存之前,我能否设置NSPersistentDocument的持久存储的配置(为“DocumentConfiguration”)?来自NSPersistentDocument文档的内容:
“保存新文档将添加所选URL的默认类型的存储,并在上下文中调用save:对于现有文档,保存仅在上下文中调用save:。”
B. 是否最好创建自己的NSPersistentStoreCoordinator和NSManagedObjectContext实例,并添加已定义配置的两个持久存储,然后使NSPersistentDocument使用这些NSPersistentStoreCoordinator和NSManagedObjectContext实例,并释放旧的实例?如果是这样,那么我该如何为addPersistentStoreWithType:...方法指定NSPersistentDocument的url?似乎只有在无标题文档被保存后才知道这个URL。(测试这一点,直到第一次保存文档之前,持久性存储协调器上没有任何临时持久存储(通过持久性存储协调器上的persistentStores方法))
C. 还是最好不要管NSPersistentDocument,而是创建自己的NSPersistentStoreCoordinator实例,专门用于持久化库存储和管理库对象模型?文档说,在多线程Core Data应用程序中应使用多个NSPersistentStoreCoordinator实例,但我不需要多线程Core Data支持。是否有两个NSPersistentStoreCoordinator实例--一个用于库,一个用于文档(直觉认为这不是必要的,可能不是正确的方法)?
有什么建议吗?
2个回答

1
我使用的解决方案基于上述C)。我保留NSPersistentDocument及其持久性存储协调器不变,而是创建自己的NSPersistentStoreCoordinator实例,专门用于持久库存储(全局存储)。
如果以后我想要将多个存储与此持久存储协调器关联(例如“LibraryConfiguration”),我可以将存储的配置设置为自定义值。由于图书馆存储由与NSPersistentDocument的持久存储协调器不同的持久存储协调器管理,因此我不需要担心为NSPersistentDocument的持久存储指定配置。

0

你需要为每个配置创建一个单独的持久化存储。这就是配置的作用,允许您将不同实体存储在同一数据模型中的不同持久化文件中。

常见的错误是忘记了持久化存储协调器可以有任意数量的持久化存储。您只需要复制苹果的样板代码,创建两个具有不同名称和/或位置以及不同配置名称的持久化存储,然后将它们都添加到持久化存储协调器中。

然后您就完成了。每个配置的实体实例将进入正确的存储。


但是NSManagedObjectContext的文档只有获取/设置持久存储协调器的方法,而没有添加协调器的方法。也就是说,据我了解,您不能将多个持久存储协调器与托管对象上下文相关联。(与托管对象上下文相关联的持久存储协调器可以管理多个持久存储,但这是不同的情况)。 - Dalmazio
抱歉,我写错了。实际上,您需要使用addPersistentStoreWithType:configuration:URL:options:error:将多个存储添加到持久性存储协调器中。 - TechZen
好的,但是在这种情况下(集成全局持久存储和基于文档的应用程序存储),仍然存在一个问题,即如上所述,在NSPersistentDocument的持久存储协调器上调用addPersistentStoreWithType:... - Dalmazio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接