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

介绍

我的iOS项目附带一个核心数据持久性存储,重量为SQLite格式,大小为160MB。 那里有大量的分组信息,用户应该能够标记最爱。 为此,我需要(至less部分)数据库具有写入function。 但是,当然,应用程序捆绑包中的持久性存储库在devise上是只读的。

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

NSPersistentStoreCoordinator的多个持久性存储

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

我知道这方面可能有些事情,但我找不到具体的细节。 如果您也有多个对象模型,是否应该只使用多个商店? 一个对象模型可以分布在两个持久存储上吗? 在浏览Core Data Programming文档时 ,我找不到任何关于如何设置的真实参考。 另外Marcus Zarra的书似乎没有深入到这个话题:

可以将多个NSPersistentStore添加到NSPersistentStoreCoordinator,这在处理分割为多个文件的数据时非常有用。 但是,在我们的例子中,我们有一个文件。 ( Marcus Zarra:“核心数据 – 苹果公司在Mac OS X上保留数据的API”第71页 )

问题

谁可以告诉我,我在想什么是可能与核心数据和多个持久性存储? 你能提供一个关于如何实现这个的暗示吗? 处理该主题的在线/离线资源也非常感谢。

答案是肯定的。 @Caleb指出正确的资源,但让它工作仍然相当尴尬。 我以为我会在这里发表简历:

对于两个NSPersistentStore实例共享相同的模型,您必须将configuration添加到您的模型中,该模型是实体的string命名的子集:

模型配置

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

获取属性的NSPredicate格式

然后,当您将商店添加到持久性商店协调人时,可以使用string作为configuration参数( 有关这里的选项的更多信息 ):

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

最后,当你想从商店B中的实体获得商店A中的实体时,就可以通过访问它来触发提取的属性,就像触发一个错误一样。

注意: fetched属性总是返回一个NSArray,因为你为build立链接而写的谓词可能有多个结果。 如果你只想得到一个实体,你可以在NSManagedObject子类的包装方法中放置这样的东西:

 Wallpaper *recordedWallpaper = [record.wallpaper lastObject]; 

是的,您可以将多个商店用于单个模型,但不能在不同商店中的对象之间创build关系。 在“核心数据编程”指南中查找“ 跨存储关系”部分,其中主要说明了这一点,并且如果需要将一个存储中的对象与另一个存储中的对象相关联,则build议使用提取的属性。

一个想法:你可能想要创build不同的商店,也为每个商店不同的持续性商店协调员。 然后为每个模型部分创build不同的托pipe对象上下文。 所以,让我们说,我有一个模型与3个实体:学生,学院和课程。 假设我想在store1中存储学生和大学实体,在Store2中存储Course,我将拥有2套managedObjectContext,pesistent store和persistent cordinator。 现在考虑到我们不能有任何交叉存储关系,在一个上下文中的修改不会影响另一个上下文。 您不必创build不同的模型或将它们关联到商店 – 例如。

Interesting Posts