具有内存存储的核心数据

时间:2009-11-07 15:56:05

标签: objective-c cocoa core-data

我想将Core Data用作数据库服务器上较大数据集的缓存。 并非所有数据都在内存中。

在考虑这个问题时,我想到了两个问题:

  1. 故障(例如1-n关系)是否可以与内存持久性存储一起使用,如果是这样,你如何捕获故障?

  2. 核心数据管理对象上下文具有过期间隔。这也适用于内存商店​​吗?

  3. 或者我应该为此目的使用NSAtomicStore吗?

1 个答案:

答案 0 :(得分:12)

您的第一个问题表明您误解了NSInMemoryStore类型持久存储的意图。它们是Core Data堆栈的 persistent 存储部分。当您将实例引入托管对象上下文时,会发生错误;创建一个错误,在触发时从NSPersistentStoreCoordinator的缓存或底层持久存储中触发并填充自身。内存存储不会改变故障关系。显然,它不会真正帮助你解决问题,但是因为你必须所有数据保存到内存中。内存存储非常适合于(1)测试(它们很快)和(2)划分核心数据堆栈,您希望在其中使用Core Data的对象图管理,而无需将任何内容保留到磁盘上。

在回答第二个问题时,答案是肯定的。陈旧性区间适用于上下文,而不是持久性存储。

那么,Core Data是否适合从远程数据库服务器缓存数据?并不是的。尽管Bill Bumgarner(一位Apple工程师)暗示这是可能的,但我发现在我自己的代码中将缓存与Core Data对象图管理分开会更容易。使用Core Data来管理对象图并轻松绑定到Controller / UI层仍然非常好。所以我的策略是从数据库服务器提取数据并将其缓存在我自己的数据结构中(OS X 10.6中的libcache和NSCache可能是一个非常好的起点)。然后在对象图中决定您想要的内容并将其迁移到Core Data堆栈(由内存持久性存储库支持)。您必须自己处理来自数据库服务器的更改通知或轮询。当数据库中的数据发生变化(或用户查询发生变化等)时,我只是告诉所有编辑者完成编辑,然后擦除上下文并从(可能)更新的缓存中重建它。