代码之家  ›  专栏  ›  技术社区  ›  diederikh

存储在内存中的核心数据

  •  5
  • diederikh  · 技术社区  · 15 年前

    我想使用核心数据作为数据库服务器上更大数据集的缓存。 不是所有的数据都在内存中。

    当进一步思考这两个问题时,我想到了:

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

    2. 核心数据管理对象上下文具有过时间隔。这是否也适用于内存中的存储?

    还是应该使用NSatomicStore?

    1 回复  |  直到 15 年前
        1
  •  12
  •   Barry Wark    15 年前

    你的第一个问题表明你误解了 NSInMemoryStore 键入持久存储。他们是 持久的 存储部分核心数据堆栈。当您将实例引入托管对象上下文时,会发生错误;会创建一个错误,该错误从 NSPersistentStoreCoordinator 激发时的缓存或基础持久存储。内存中的存储区不会更改错误关系。很明显,这对你的问题没有真正的帮助,但是因为你必须 坚持 所有的数据到内存。内存中的存储非常适合(1)测试(它们很快)和(2)抓取核心数据堆栈,在这些堆栈中,您需要使用核心数据的对象图管理,而无需将任何内容保存到磁盘上。

    回答你的第二个问题,答案是“是”。过时间隔适用于上下文,而不是持久存储。

    那么,核心数据是否适合缓存来自远程数据库服务器的数据?不是真的。虽然bill bumgarner(一位苹果工程师)暗示这是可能的,但我发现在我自己的代码中,将缓存与核心数据对象图形管理分离要容易得多。使用核心数据来管理对象图和方便绑定到控制器/UI层仍然非常好。因此,我的策略是从数据库服务器中提取数据并将其缓存在我自己的数据结构中(OS X 10.6中的libcache和nscache可能是一个很好的起点)。然后决定在对象图中需要什么,并将其迁移到核心数据栈(由内存中的持久存储支持)。您必须自己处理来自数据库服务器的更改通知或轮询。当数据库中的数据更改(或用户查询更改等)时,我只告诉所有编辑器完成编辑,然后擦除上下文并从(可能)更新的缓存中重新生成它。