【问题标题】:NSCoding VS Core dataNSCoding VS 核心数据
【发布时间】:2012-03-23 02:11:24
【问题描述】:

我一直在寻找一篇解释 NSCoding (NSKeyedArchiver...) 相对于使用 CoreData (SQLite...) 的优缺点的文章。

有很多选择,我可以实现自己的自定义二进制读取器/写入器,或者使用 plists/xml/json... 或者使用 SQLite 或 NSCoding。

我现在有点迷路了。 任何机构都可以解释主要功能之间的区别吗?

【问题讨论】:

标签: ios core-data persistence nscoding data-management


【解决方案1】:

为了增加已经很好的答案,NSCoding 和 NSKeyedArchiver 是存储对于 NSUserDefaults 来说太大(或不兼容的数据类型)但对于 CoreData 来说太小且数量不多的数据的好方法。

【讨论】:

    【解决方案2】:

    这取决于您要保存哪种数据,以及您是仅在内部使用它还是必须与外部服务交换数据。

    NSCoding 通常是一个数据序列化器。许多内置对象实现了 NSCoder 协议,允许您将它们保存为二进制流(文件、sqlite 的 BLOB 等)。NSKeyedArchiver 为您提供了基于字符串标签在此类流中搜索的优势,有点像字典,但您只能使用字符串作为键。如果您偶尔需要持久化一些不同类的对象,这种方法很好。

    但是,如果您有 许多 相同 类的对象,则最好使用数据库方法、SQLite 或 CoreData。 CoreData 实际上是一个围绕 SQLite 的包装器,它简化了数据模型的设计,并且在幕后对数据库进行查询,而无需编写 SQL 语句。在 CoreData 中,您可以定义您的类,并且该类的每个实例都可以持久化,即您可以取回对象成员的值,而无需将它们始终保存在内存中。这是存储大量结构化数据的一种非常方便的方式。例如,如果您要编写一个 Web 浏览器,您可以存储用户的书签,包括名称、URL 以及可能的上次访问时间。

    对于 XML 和 JSON,如果您仅在设备本地使用数据,则没有特别的优势。如果您必须与某些外部服务进行通信,您可能会考虑缓存/保存 XML / JSON 对象以供以后使用。其他方法是在每次需要时从您的内部数据结构(见上文)重新生成这些数据。

    如果您自己设计数据模型,我认为使用 plist 的意义就更小了,但也许有人会纠正我。

    编辑:我在这里添加了一个简短的链接参考,用于指导如何使用 NSCodingCore Data 以及作为奖励,SQLite

    更新 12.01.2016:如果您正在寻找持久性解决方案,我建议您也查看 Realm

    【讨论】:

    • 如果一个 sqlite 的 blob 文件被序列化,这可能意味着为了获得最小的二进制数据块,序列化是最好的。您也可以将 NSCoding 用于 conditionalObjectEncodings,它消除了内存中活动对象实例的重复。我问这个问题的原因是因为每个人都在谈论并建议 Coredata-SQLite,但我没有看到这种优势,除非针对一个巨大的数据源构建,并且你不能把所有这些都放在内存中。我说的对吗?
    • 内存和性能优化之间总是存在平衡的。使用 NSCoding 或您的自定义二进制表示,您可以更好地控制写入存储或存储在内存中的位,但为此您必须付出更多编码的代价,因此代码的效率将取决于您的能力。 CoreData/SQLite 以一种有效的方式为您实现了许多有用的东西(搜索、查询、索引、连接等)。注意:CoreData 对象仅在需要时才加载到内存中,否则它们会留在数据库中。
    • 优秀。因此,如果我使用应用程序的“ApplicationDocument”模板,并且如果我需要保存和打开文档,我真的不需要 CoreData 的好处,因为我需要将所有内容加载到内存中,并且不需要查询和... 数据库功能。主要区别在于开发成本。在我的情况下,这不是一个挫折。非常感谢。在接受答案之前,我会稍等片刻,以吸引更多答案和更多讨论
    • 是的,开发自己的(二进制)文档格式是使用更底层的序列化类型工具(如 NSCoder 框架)的典型案例。
    • 我知道这是一个较旧的线程,但我想我会添加一些见解。老实说,我也会将简单性和安全性作为关键点。
    【解决方案3】:

    Mattt Thompson 对 NSHipster 上的 NSCoding、Core Data 和 NSKeyedArchiver 之间的各种差异进行了可消化的细分:http://nshipster.com/nscoding/

    【讨论】:

      【解决方案4】:

      对象和关系结构之间总是存在阻抗。我总是更喜欢对象,因为数据访问通常只是您应用程序中功能的一小部分。使用 NSCoding,您可以获得简单、易于调试和控制,并且无论如何都需要编写很少的代码。您还可以灵活地将 NSCoding 合并到您的数据库结构中。

      NSCoding 是一种保存对象的持久化机制。如果您将索引添加到关系结构中以进行搜索优化并维护对象结构,那么我认为您可以以极低的成本和易于维护的方式获得最好的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 2019-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多