基于内存的Core Data存储

6
我希望使用Core Data作为大型数据库服务器上数据集的缓存,但不是所有数据都在内存中。
进一步思考时,我想到了两个问题:
1. 是否可以使用虚拟属性(例如对于1-n关系)与内存持久化存储并触发虚拟属性时如何捕获?
2. Core Data管理的对象上下文具有过期间隔。这是否也适用于内存存储?
或者我应该使用NSAtomicStore来实现这个目的?

几乎听起来你真正想做的是实现自己的存储层:管理对象,它们会回退到一个持久化存储,即你的数据库服务器。 - Sixten Otto
是的,但唯一的方法是使用NSAtomicStore(在Mac OS X 10.5+中),然后你必须一次性加载所有内容,据我所知。 - diederikh
1个回答

13

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

对于您的第二个问题,答案是 YES。不过这个旧数据时间间隔适用于上下文,而不是持久化存储。

那么,Core Data 是否适用于缓存来自远程数据库服务器的数据呢?不太适合。尽管 Apple 工程师 Bill Bumgarner 暗示过可能有解决方法,但在我的代码中,我发现将缓存与 Core Data 对象图管理分离要容易得多。仍然很好使用 Core Data 来管理对象图并方便地绑定到控制器/UI 层。因此,我的策略是从数据库服务器获取数据并将其缓存在自己的数据结构中 (libcache 和 OS X 10.6 中的 NSCache 可能是非常好的起点)。然后决定您想要在对象图中的内容,并将其迁移到 Core Data 堆栈(由内存持久化存储支持)。您将不得不自己处理来自数据库服务器的更改通知或轮询。当来自数据库的数据发生更改 (或用户查询发生更改等) 时,我只需告诉所有编辑器完成编辑,然后清除上下文并从 (可能) 更新的缓存中重建它。


你是对的,我之前错误地认为内存存储会在上下文中以不同的方式处理事物(以防止对象在内存中出现两次)。但这显然不是这种情况。我也看了一下NSAtomicStore,将东西加载到持久性存储协调器的缓存中。我看到的问题是我无法控制对象的陈旧程度(我不想将整个数据库加载到缓存中)。我希望更多或更少与Sqlite存储相同的行为。使用NSCache,您可以设置缓存中对象的最大数量限制。这很好。 - diederikh
@barrywark,根据您的回答,我理解第二点“在你想使用Core Data的对象图管理而不必将任何东西持久化到磁盘中时,可以使用scratch core data stacks”是指“如果您想在磁盘不可用或存储空间不足的情况下将核心数据堆栈存储在内存中”,因此,在某些情况下,如果我想将数据存储在内存中(因为磁盘不可用),我可以将数据存储在内存中。 - gaussblurinc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接