5

我有一个按原样工作的基于文档的核心数据应用程序。我想添加对全局持久存储的支持以保存项目库。

我已经阅读了大部分相关文档,并且了解我应该在托管对象模型中使用配置。我定义了两个配置:“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 的持久存储之前设置它的配置(到“Doc​​umentConfiguration”)吗?来自 NSPersistentDocument 文档:

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

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

C. 还是不理会 NSPersistentDocument 并创建我自己的 NSPersistentStoreCoordinator 实例,该实例专门用于持久库存储和托管库对象模型?文档说 NSPersistentStoreCoordinator 的多个实例应该在多线程核心数据应用程序中使用,但我不需要多线程核心数据支持。是否需要有两个 NSPersistentStoreCoordinator 实例——一个用于库,一个用于文档(直觉说这不是必需的,而且可能不是正确的方法)?

有什么建议么?

4

2 回答 2

1

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

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

于 2010-12-14T09:09:58.437 回答
0

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

这里的一个常见错误是忘记了持久存储协调器可以拥有任意数量的持久存储。您需要做的就是复制 Apple 样板以创建两个具有不同名称和/或位置且每个具有不同配置名称的持久存储。然后将两者都添加到持久存储协调器中。

你完成了。每个配置的实体实例将进入正确的存储。

于 2010-11-18T18:27:58.447 回答