19

当我一直在研究使用核心数据与 Web 服务交互的最佳方法时,我一直在看到这种情况NSIncrementalStore出现。

在阅读了 Drew Crawford 的文章编程指南类参考 和本教程几次之后,我仍然在努力理解什么是NSIncrementalstore,为什么以及何时使用它。

有人可以解释一下吗?

阅读 mundi 的回答后进行编辑
,我可以看到需要进一步的上下文。我正在研究将核心数据与我正在构建的 Web 服务结合使用。我正在尝试找到将用户信息本地存储在设备上并在有连接时发布到 Web 服务的最佳方法。我缺乏对核心数据的了解促使我进行研究,但我无法完全理解NSIncrementalStore.

4

3 回答 3

34

注意:当我在 2012 年写这篇文章时,这个 API 是最前沿的,细节已经改变。如果您愿意,请随时更新。我目前没有从事任何 Cocoa/ObjC 项目,所以很遗憾,我不是一个保持最新状态的好人。看来总体要点是正确的。

NSManagedObjectCore Data 提供了一组帮助管理对象持久性的工具,即能够保存然后从某种存储中取回对象集( )。

当您使用 Core Data 对象时,您使用的是NSManagedObjectContextNSPersistentStoreCoordinator. PSC 反过来与一个或多NSPersistentStore个子类进行对话,这些子类处理商店的实际操作。(考虑针对数据库创建/读取/更新/删除。)

Core Data 支持两种主要类型的存储:NSPersistentStoreNSAtomicStore. 可以将持久存储视为数据库:您可以增量地保存、更新和从中获取任意记录集。原子存储是对象图的“全有或全无”表示。它旨在成为结构化文件的内存表示。

Core Data 自带的 store 类型有:

  • NSSQLLiteStoreType ( NSPersistentStore)
  • NSInMemoryStoreType( NSPersistentStore)
  • NSXMLStoreType ( NSAtomicStore)
  • NSBinaryStoreType ( NSAtomicStore)

NSPersistentStore被明确禁止子类化,所以直到现在,还没有办法创建自己的非原子存储后端。也就是说,如果您想零碎地保存和查询对象的表示,而不是一大堆(“加载整个图”、“保存整个图”),那么您就很不走运了。直到 iOS5 推出NSIncrementalStore

NSIncrementalStore是一个抽象类(继承自NSPersistentStore),您实现其方法以在您控制的数据存储和 Core Data 世界之间提供适配器。您可以使用它来包装远程 API,或者如果您愿意,您可以包装NULevelDBNanoStore 之类的东西(尽管我不确定您为什么要这样做)。

于 2012-06-22T17:13:49.220 回答
9

您将使用NSIncrementalStore通过 Core Data 访问远程服务器。您无需读取和写入本地文件,而是将请求推送到服务器并获得响应,然后将其推送到 Core Data。同样用于保存等。

但是请注意,这并非易事。这是一个非常强大的功能,但除非你是 Core Data 使用方面的专家,否则我强烈反对它,因为除非你非常了解 Core Data 与存储层的交互方式,否则有无穷无尽的机会让你自食其果作品。

如果使用 anuploaded可以解决您的问题,请改为这样做。

于 2012-05-06T10:23:38.330 回答
5

简而言之,如果您将 SQLite 存储与 Core Data 一起使用,那么您已经在使用增量存储。增量存储的所有好处(即主要不必将整个存储加载到内存中)已经在您的手中。

至于NSIncrementalStoreAPI的具体应用,我建议你先明确定义你要解决的问题。您是否需要此 API 将取决于您的编程任务的特定需求。


编辑以回应问题编辑

我会这样做:在设备上的核心数据实体中,您可以拥有一个属性BOOL uploaded。当 Web 服务可用时,开始上传并拉取所有uploaded尚未加载的对象。

要上传,请将您的对象转换为NSArrayNSDictionary,也许转换为 JSON 格式并POST传输到您的网站。当网站响应它保存了数据时,将所有对象标记为uploaded

于 2012-05-05T09:22:13.487 回答