【问题标题】:Explanation of NSIncrementalStore in plain englishNSIncrementalStore 的简单英文解释
【发布时间】:2012-05-14 15:15:46
【问题描述】:

当我一直在研究使用核心数据与 Web 服务交互的最佳方式时,我一直看到 NSIncrementalStore 弹出。

在阅读an article by Drew Crawforda programming guidea class referenceand this tutorial 几次之后,我仍然在努力理解NSIncremental store 是什么,为什么以及何时使用它。

谁能解释一下?

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

【问题讨论】:

    标签: ios web-services cocoa-touch core-data ios5


    【解决方案1】:

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

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


    EDIT回应问题编辑

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

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

    【讨论】:

    • 这是一个聪明的方法。我在想我也许可以使用 NSIncrementalStore 写入本地数据库并尝试使用网络数据库。我将不得不使用比您概述的更复杂的系统,以便设备知道要上传什么而不是所有内容。谢谢。我仍然愿意接受建议和答案,所以我会暂时不回答这个问题。谢谢
    • 好吧,我不知道为什么它必须比我概述的更复杂。
    • 因为上传整个本地结构会很麻烦。上传插入、删除和更新更有效。为此,您必须在数据结构中维护它。但是,我相信核心数据会在您在上下文中运行保存选择器之前维护该数据。您对此有什么建议吗?
    • 对不起,您似乎没有仔细阅读我的回答。您只会上传尚未上传的记录。它是增量的,这就是您想要的。这就是属性 uploaded 的用途。
    • 啊,我确实看错了,我以为您是在暗示所有实体的“上传”属性,而不是每个实体一个。这更有意义,但似乎将数据结构和上传结构结合在一起。我宁愿避免这种依赖。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,我知道核心数据在主线程上运行,并且核心数据使用它不会在上传/下载运行时锁定主线程吗?此外,它是否“替换”了本地 sqlite 数据库?
    • 没有。 Core Data 可以在任何线程上运行。它不是线程安全的:每个队列都需要一个上下文(如果还没有 GCD,则需要线程)。就像其他任何不是线程安全的东西一样。
    【解决方案3】:

    注意:当我在 2012 年编写此 API 时,此 API 处于最前沿,细节已更改。如果您愿意,请随时更新。我目前没有在任何 Cocoa/ObjC 项目上工作,所以很遗憾,我不是一个保持最新状态的好人。看来整体的主旨是正确的。

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

    当您使用 Core Data 对象时,您可以使用 NSManagedObjectContext,您可以从 NSPersistentStoreCoordinator 获得。 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 之类的东西(尽管我不确定您为什么要这样做)。

    【讨论】:

    • 我认为您的意思是说NSIncrementalStore 和 NSAtomicStore,而不是“NSPersistentStore [这是基类] 和 NSAtomicStore”。
    • 坦率地说,我不知道 - 我在 4 年前写了这篇文章,并且在大约相似的时间内没有为 iOS 编写任何代码。对不起!
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2010-10-03
    • 2017-10-12
    • 2021-10-14
    相关资源
    最近更新 更多