Introduction

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

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

Multiple persistent stores for NSPersistentStoreCoordinator

这就是为什么我想到使用两个持久存储.第一个可能是Bundle 包中的大实体,第二个可能是文档文件夹中的小实体,存储与大store 有关系的特殊"Collection "实体.

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

可以向NSPersistentStore Coordinator添加多个NSPersistentStore,这在处理拆分为多个文件的数据时非常有用.然而,我们的考试只有一个文件.(Marcus Zarra: "Core Data - Apple's API for Persisting Data on Mac OS X" page 71)

The Question

谁能告诉我,核心数据和多个持久性存储是否可能实现我的 idea ?你能不能提供一个关于如何实现这一点的提示?我们也非常感谢与该主题相关的线上/线下资源.

推荐答案

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

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

型号配置

在模型中,向属于第二个存储的实体添加一个获取属性(NSFetchedPropertyDescription表示googlability).这是一个非常简单的存储过程,看起来可能是这样的:

获取的属性的预测格式

然后,在将存储添加到持久存储协调器时,使用configuration参数的字符串(info about the options here个以上):

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

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

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

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

Wallpaper *recordedWallpaper = [record.wallpaper lastObject];

Objective-c相关问答推荐

iOS8:退出应用程序后不久出现蓝条正在使用您的位置

我在哪里可以找到 info.plist 文件?

当我们只能使用 NSObject 时,为什么还要使用 id?

Objective-c中release和dealloc的区别

如何判断字符串是否仅包含目标C中的字母数字字符?

更改后退导航栏按钮的字体

添加自定义 initWith?

如何在 iPhone 中将 NSData 转换为字节数组?

如何在 Objective-C 中创建静态方法?

发出许多网络请求的 iOS 应用程序的最佳架构?

UICollectionView 单元格 Select 和单元格重用

代码问题:格式字符串不是字符串文字

从 URL Objective C 获取图像

如何将 NSOperationQueue 与 NSURLSession 一起使用?

Objective C 中的对象分配和初始化

IOS 中的圆形进度条

UIView: opaque vs. alpha vs. opacity

捕捉固定步数的 UISlider(如 iOS 7 设置应用程序中的文本大小)

无法从其 DataSource 获取单元格

如何将 printf 与 NSString 一起使用