我有一个基于文档的Core Data应用程序,目前已经可以使用。我想添加全局持久存储支持来保存项目库。
我已经阅读了大部分相关文档,并理解应该在托管对象模型中使用配置。我定义了两个配置:“DocumentConfiguration”和“LibraryConfiguration”。文档配置中的实体仅存在于文档配置中,而库配置中的实体仅存在于库配置中,即没有重叠。
然后文档中说“创建协调器时使用此模型”。但是,我实际上并没有创建自己的持久存储协调器,因为我正在使用默认的NSPersistentDocument协调器。
以下是一些关于如何最好地进行操作以及帮助澄清可能存在的任何误解的问题:
A. 我是否应该在NSPersistentDocument中获取NSPersistentStoreCoordinator,然后按照以下方式向其添加新的持久存储:
我认为这可能会成为一个问题,因为我没有在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实例--一个用于库,一个用于文档(直觉认为这不是必要的,可能不是正确的方法)?
有什么建议吗?
我已经阅读了大部分相关文档,并理解应该在托管对象模型中使用配置。我定义了两个配置:“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实例--一个用于库,一个用于文档(直觉认为这不是必要的,可能不是正确的方法)?
有什么建议吗?
addPersistentStoreWithType:configuration:URL:options:error:
将多个存储添加到持久性存储协调器中。 - TechZen