多个(两个)持久性存储可以与一个对象模型一起使用,同时保持从一个到另一个的关系吗?

epo*_*gee 41 cocoa-touch core-data objective-c multiple-databases

介绍

我的iOS项目附带一个Core Data持久存储,重量约为160MB,采用SQLite格式.那里有大量的分组信息,用户应该可以在其中标记收藏.为此,我需要(至少部分)数据库具有写入功能.但当然,应用程序包中的持久存储是按设计只读的.

如果您希望商店具有读写功能,则应将其复制到例如应用程序的文档文件夹中.我不想这样做,因为那时应用程序将是两倍大小,而该数据库的主要部分仍然是只读的.那将浪费资源.

NSPersistentStoreCoordinator的多个持久存储

这就是为什么我想到使用两个持久存储.第一个是捆绑中的大一个,第二个可能是文档文件夹中的一个小的,存储与大商店有关系的特殊"最喜欢"实体.

我知道在这方面有可能做到,但我找不到具体细节.如果您还有多个对象模型,是否应该只使用多个商店?一个对象模型可以在两个持久存储上"分布"吗?浏览核心数据编程文档时,我找不到任何关于如何设置它的真正参考.Marcus Zarra的书似乎也没有深入研究这个主题:

可以向NSPersistentStoreCoordinator添加多个NSPersistentStore,这在处理拆分为多个文件的数据时非常有用.但是,在我们的例子中,我们只有一个文件.(Marcus Zarra:"核心数据 - Apple在Mac OS X上保存数据的API"第71页)

问题

谁可以告诉我,我在想什么是可能的Core Data和多个持久存储?你能提供一些关于如何实现这一目标的提示吗?处理该主题的在线/离线资源也非常受欢迎.

epo*_*gee 46

答案是肯定的.@Caleb指向合适的资源,但让它工作仍然很尴尬.我以为我会在这里放一个简历:

对于NSPersistentStore共享相同模型的两个实例,您必须向模型添加配置,该配置是实体的字符串命名子集:

型号配置

在模型中,对于属于第二个商店的实体,添加一个fetched属性(NSFetchedPropertyDescription用于googlability).这是一个非常简单的存储过程,它看起来像这样:

获取属性的NSPredicate格式

然后,当您将存储添加到持久性存储协调器时,可以使用configuration参数的字符串(有关这些选项的更多信息):

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                          configuration:@"ModifyInBackground" 
                                                    URL:storeURL1
                                                options:options
                                                  error:&error]

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                          configuration:@"ModifyInMain"
                                                    URL:storeURL2 
                                                options:options 
                                                  error:&error]
Run Code Online (Sandbox Code Playgroud)

最后,当您想要从商店B中的实体到商店A中的实体时,只需通过访问它就可以像触发错误一样触发获取的属性.

注意: fetched属性始终返回NSArray,因为您为编写链接而编写的谓词可能具有多个结果.如果你想只使用一个实体,你可以在你的NSManagedObject子类的包装方法中放置这样的东西:

Wallpaper *recordedWallpaper = [record.wallpaper lastObject];
Run Code Online (Sandbox Code Playgroud)

  • 你太棒了,一段代码和2张图片比Apple的文档说得多,谢谢! (5认同)
  • 它的StackOverflow值得拥有真正的功劳,但是你还是结束了我的一天,谢谢! (2认同)

Cal*_*leb 5

是的,您可以为单个模型使用多个商店,但不能在不同商店中的对象之间创建关系.在核心数据编程指南中查找" 跨存储关系"部分,该部分基本上说明了这一点,并建议在需要将一个存储中的对象与另一个存储中的对象相关联时使用获取的属性.