具有全局持久存储的基于核心数据文档的应用程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有全局持久存储的基于核心数据文档的应用程序相关的知识,希望对你有一定的参考价值。
我有一个基于文档的核心数据应用程序,它按原样运行。我想添加对全局持久性存储的支持来保存项目库。
我已经阅读了大部分相关文档,并了解我应该在托管对象模型中使用配置。我已经定义了两个配置:“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只在上下文中调用save :.
B.创建我自己的NSPersistentStoreCoordinator和NSManagedObjectContext实例,添加定义了配置的两个持久存储,然后使NSPersistentDocument使用这些NSPersistentStoreCoordinator和NSManagedObjectContext实例并释放旧实例会更好吗?如果是这样,我如何为addPersistentStoreWithType:...方法指定NSPersistentDocument的url?只有在保存无标题文档后,才会知道此URL。 (测试一下,在第一次保存文档之前,似乎没有任何临时持久性存储(通过持久性存储协调器上的方法persistentStores)。
C.或者最好不要单独留下NSPersistentDocument,并创建我自己的NSPersistentStoreCoordinator实例,我专门用于持久库存储和托管库对象模型?文档说NSPersistentStoreCoordinator的多个实例应该在多线程Core Data应用程序中使用,但我不需要多线程Core Data支持。是否需要有两个NSPersistentStoreCoordinator实例 - 一个用于库,一个用于文档(直觉说这不是必需的,可能不是正确的方法)?
有什么建议?
我使用的解决方案效果很好,基于上面的C)。我留下NSPersistentDocument并且它只是持久性存储协调器,而是创建我自己的NSPersistentStoreCoordinator实例,我专门用于持久库存储(全局存储)。
我可以将商店的配置设置为自定义值,以防我希望稍后与此持久性存储协调器关联多个存储(例如,“LibraryConfiguration”)。由于库存储由不同于NSPersistentDocument的持久存储协调器的持久存储协调器管理,因此我不需要担心为NSPersistentDocument的持久存储指定配置。
您需要为每个配置创建单独的持久性存储。这就是配置的用途,允许您将同一数据模型中的不同实体存储到单独的持久文件中。
这里常见的错误是忘记了持久性存储协调器可以拥有任意数量的持久存储。您需要做的就是复制Apple样板,以创建具有不同名称和/或位置的创建两个持久存储,每个存储具有不同的配置名称。然后将两者都添加到持久性存储协调器。
你完成了。每个配置的实体实例将进入正确的商店。
以上是关于具有全局持久存储的基于核心数据文档的应用程序的主要内容,如果未能解决你的问题,请参考以下文章
核心数据:具有多个上下文的独立持久存储与具有单个上下文的独立持久存储
核心数据迁移问题:“持久存储迁移失败,缺少源托管对象模型。”
在哪里存储持久容器(或任何全局对象)? AppDelegate 还是场景委托?