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

Objective c 一个对象模型可以使用多(两)个持久性存储,同时保持一个对象模型与另一个对象模型之间的关系吗?,objective-c,cocoa-touch,core-data,multiple-databases,Objective C,Cocoa Touch,Core Data,Multiple Databases,导言 我的iOS项目附带了一个核心数据持久存储,重量约160MB,采用SQLite格式。其中有大量分组信息,用户应该能够在其中标记收藏夹。为此,我需要(至少部分)数据库具有写功能。但当然,应用程序包中提供的持久存储在设计上是只读的 如果您希望商店具有读写功能,则应将其复制到应用程序的文档文件夹中。我不想这样做,因为这样应用程序的大小将是原来的两倍,而数据库的主要部分是只读的。那将是浪费资源 NSPersistentStoreCoordinator的多个持久存储 这就是为什么我想到使用两个持久存储

导言

我的iOS项目附带了一个核心数据持久存储,重量约160MB,采用SQLite格式。其中有大量分组信息,用户应该能够在其中标记收藏夹。为此,我需要(至少部分)数据库具有写功能。但当然,应用程序包中提供的持久存储在设计上是只读的

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

NSPersistentStoreCoordinator的多个持久存储

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

我知道在这方面是可能的,但我找不到具体细节。如果您也有多个对象模型,是否应该只使用多个存储?一个对象模型可以“分布”在两个持久存储上吗?当浏览时,我找不到任何关于如何设置的真正参考。此外,马库斯·扎拉的书似乎没有深入探讨这一主题:

可以向NSPersistentStoreCoordinator添加多个NSPersistentStore,这在处理拆分为多个文件的数据时非常有用。然而,在我们的示例中,我们只有一个文件。()

问题


谁能告诉我,如果核心数据和多个持久存储,我所想的是否可能?你能提供一个关于如何实现这一点的提示吗?非常感谢与本主题相关的在线/离线资源。

是的,您可以为一个模型使用多个存储,但不能在不同存储中创建对象之间的关系。请参阅《核心数据编程指南》中的一节,该节基本上说明了这一点,如果需要将一个存储中的对象与另一个存储中的对象关联起来,建议使用获取的属性。

一个想法:您可能希望为每个存储创建不同的存储,以及不同的持久存储协调器。然后为每个模型部件创建不同的托管对象上下文。让我们假设,我有一个包含3个实体的模型:学生、学院和课程。假设我想在store1中存储学生和学院实体,在Store2中存储课程,我将有两组managedObjectContext、pesistent store和persistent cordinator。既然我们不能有任何跨存储关系,一个上下文中的修改不会影响另一个上下文。你不必创建不同的模型或将它们与商店关联,等等。

答案是肯定的@Caleb指出了正确的资源,但要让它发挥作用仍然相当困难。我想我应该在这里放一份简历:

要使两个
NSPersistentStore
实例共享同一个模型,必须向模型中添加一个配置,该配置是一个名为实体子集的字符串:

在模型中,对于属于第二个存储区的实体,可以添加一个fetched属性(
NSFetchedPropertyDescription
forgooglasability)。这是一个非常简单的存储过程,它可以如下所示:

然后,将存储添加到持久存储协调器时,将字符串用于
配置
参数(更多):

最后,当您想从存储区B中的实体获取存储区A中的实体时,只需访问它,就可以触发获取的属性,就像触发故障一样

注意:获取的属性总是返回NSArray,因为您为建立链接而编写的谓词可能有多个结果。如果只想访问一个实体,可以在
NSManagedObject
子类的包装器方法中放置如下内容:

Wallpaper *recordedWallpaper = [record.wallpaper lastObject];

很难从文档中获得一个工作示例。从描述来看,这是一条路要走。但是在这种情况下,模型是什么样子的呢?您是否也使用两种不同的托管对象模型?或者一个模型有两个存储?换言之:如何在模型编辑器中指定哪些实体属于哪个存储?它是这样工作的吗?是的,这就是我最后做的。问题是,我希望能够使用Xcode建模工具对应用程序使用的数据有一个完整的概述。但我没能做到这一点我差一点就搞定了,看示例项目你把它复杂化了。@Rog说:“将数据库从捆绑包复制到库文件夹中,然后使用它。考虑到你对一个2年前的问题或一年前对该问题的评论,你在这里不是很有建设性。”。该应用程序的数据库现在接近250兆,我认为它的用户只会欣赏它一次。你太棒了,一段代码和两张图片比苹果的文档更能说明问题,谢谢!这是StackOverflow应得的真正荣誉,但你还是让我开心,谢谢!快速提问:在您发布的
添加PersistentStoreWithType:…
代码中,什么是
选项
?我用其中一个模板构建了我的应用程序,它只将
nil
发送到
选项:
。编辑:请参见以下内容:
NSDictionary*options=@{nsmigratePersistentStoresAutomaticalyOption:@YES,nsinFermappingModelAutomaticalyOption:@YES}
Wallpaper *recordedWallpaper = [record.wallpaper lastObject];