具有内存存储的核心数据

Posted

技术标签:

【中文标题】具有内存存储的核心数据【英文标题】:Core Data with in-memory store 【发布时间】:2009-11-07 15:56:05 【问题描述】:

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

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

    是否可以将故障(例如对于 1-n 关系)与内存中持久存储一起使用,如果可以,您如何捕获故障触发?

    Core 数据托管对象上下文具有过时间隔。这也适用于内存存储吗?

或者我应该为此使用 NSAtomicStore 吗?

【问题讨论】:

听起来您真正想要做的几乎是实现自己的存储层:托管对象故障返回到持久存储,即您的数据库服务器。 是的,但唯一的方法是使用 NSAtomicStore(在 Mac OS X 10.5+ 中),然后您必须立即将所有内容加载到 AFAIK 中。 【参考方案1】:

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

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

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

【讨论】:

你是对的,我认为出于某种原因,内存存储会处理与上下文不同的想法(以防止对象在内存中两次)。但这当然不是事实。我还查看了 NSAtomicStore 以将内容加载到持久性存储协调器的缓存中。我看到的问题是我无法控制对象的陈旧性(我不想将整个数据库加载到缓存中)。我想要更多与 Sqlite 商店相同的行为。使用 NSCache,我可以看到您为缓存中的最大对象数设置了限制。这很好。 @barrywark,根据您的回答,我是否更正了第 2 条“您希望在其中使用 Core Data 的对象图管理而无需将任何内容持久化到磁盘的核心数据堆栈”的意思是“如果您想要在磁盘或存储不可用的情况下将核心数据堆栈存储在内存中,然后再保存到磁盘”?因此,在某些情况下,如果我想将数据存储在内存中(因为磁盘不可用),我可以将数据存储在内存中。

以上是关于具有内存存储的核心数据的主要内容,如果未能解决你的问题,请参考以下文章

在核心数据中存储图像

RestKit 内存核心数据存储的配置

用于单元测试的内存存储中的 iOS 10 核心数据

当更新版本已经在内存中时,强制核心数据从以前存储的版本刷新 NSManagedObject

使用 .NET 核心设置内存限制

HDFS中的存档存储SSD 和内存