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).这是一个非常简单的存储过程,它看起来像这样:
然后,当您将存储添加到持久性存储协调器时,可以使用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)
归档时间: |
|
查看次数: |
12793 次 |
最近记录: |