将多个 CoreData 数据库动态合并为一个虚拟的单一数据库
Posted
技术标签:
【中文标题】将多个 CoreData 数据库动态合并为一个虚拟的单一数据库【英文标题】:Dynamically merge several CoreData databases, all with the same model, into a virtual single database 【发布时间】:2013-10-26 06:24:40 【问题描述】:我环顾四周,找不到以下问题的完整答案。
我计划构建一个 ios 应用程序,它将处理 UserData 并通过初始包提供 SeedData。已经有一个有用的post 来说明如何联合使用位于两个不同持久存储中的两个数据库。就我而言,它只响应部分问题。
我希望能够提供各种种子数据集以允许存储空间管理,因为数据集相当大,尤其是多媒体材料。
基本上,SeedData 将根据标准进行拆分并可供下载:因此用户可以根据他们的需要和想要使用多少存储空间下载标准 1、标准 2 和/或标准 3 的文件.数据将以 .sqlite 文件的形式提供,每个文件当然共享相同的数据模型。
现在,会有一些小的数据重叠(在我的情况下无法避免),因此单个元素可能同时在具有条件 1 的集合和具有条件 3 的集合中。然而,最终应用程序将只显示一个元素。
我已经考虑了两种方法,但我不确定要走哪条路,意见和建议是否真的很棒:
静态合并:下载一个新数据集时,将数据从源复制到应用程序数据库,然后丢弃下载的数据。我不喜欢这种方法,因为 a) 它在加载期间需要双倍的数据集存储空间 b) 它可能非常耗时 c) 由于数据集预计会超时更新,更新可能很难实现并且需要再次下载一个大文件并使用两倍于数据集本身的大小
动态合并:在沙盒缓存目录中保留多个文件(如 .../Cache/criteria1/、.../Cache/criteria2/ 等),这将允许在丢弃时添加和删除文件夹时只需下载文件夹的内容,并且只需要创建一个虚拟 SeedData 这将是几个 .sqlite 文件之间的动态合并(动态合并将丢弃重复项从而解决重叠)。此外,更新将非常容易处理,因为只需通过下载新内容替换文件夹的内容即可。然后,如之前共享的链接中所述,我将拥有一个 UserData 数据库(将用于 r/w)和一个由多个数据文件组成的 SeedData(将严格用于 r-only)。
李>到目前为止,我已经进行了很多搜索,但我无法找到令人满意的方法来实现这一点(或者我不明白)。我严格针对 iOS 7。
如果可以的话,感谢您的帮助 :) 克里斯
【问题讨论】:
【参考方案1】:嗯,这比我想象的要容易得多。我实际上做了一些测试和使用
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:&error];
]
只要有 storeURL,您就可以使用单个 NSFetchRequest 一次访问所有表。
当然,在重叠的情况下,提取请求需要以消除重复的方式进行雕刻(如果这是您想要的)。
【讨论】:
以上是关于将多个 CoreData 数据库动态合并为一个虚拟的单一数据库的主要内容,如果未能解决你的问题,请参考以下文章
c# Word-AddIn 将 activeDocument 转换为虚拟 PDF 并将它们合并为一个 PDF 文档