NSCoding和Core Data的区别

25

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

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

我现在有点迷失了。有人能解释一下主要特点之间的区别吗?


2
可能重复问题:http://stackoverflow.com/questions/4989609 https://dev59.com/kHRA5IYBdhLWcg3wvgsb - Richard J. Ross III
2
事实上,SQLite 被认为是 CoreData 中的一部分。而你提供的第一个链接则具体讨论了 SQLite3 与 NSCoding 的区别,但并没有给出太多答案。我想问一个更加通用的问题:为什么有这么多处理数据的选项? - LolaRun
顺便提一下,Core Data 可以自动调用已采用 NSCoding 的可转换属性上的 NSCoding 方法,并将该属性转换为二进制 blob,可以保存在 Core Data 中。更多信息请参见 Do all attributes with a custom type in core-data have to be a relationship? - mfaani
4个回答

35

这取决于您要保存哪种类型的数据以及是否仅在内部使用,还是需要与外部服务交换数据。

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,但我没有看到那个优势,除非构建针对巨大的数据源,并且您无法将所有内容放入内存中。我是对的吗? - LolaRun
2
在内存和性能优化之间总是有一种平衡。通过NSCoding或自定义的二进制表示,您可以更加精确地控制写入存储或存储在内存中的比特位,但为此您必须付出编码更多的代价,因此代码的效率将取决于您的能力。使用CoreData/SQLite,很多有用的功能被以高效的方式实现(搜索、查询、索引、连接等)。注意:CoreData对象仅在需要时加载到内存中,否则它们会留在数据库中。 - MrTJ
非常好。所以,如果我正在使用应用程序的“ApplicationDocument”模板,并且如果我需要保存和打开文档,我实际上不需要CoreData的好处,因为我需要将所有内容加载到内存中,而不需要查询和...数据库功能。主要区别在于开发成本。在我的情况下,这并不是一个障碍。非常感谢。我会等一会儿,以吸引更多的答案和讨论,然后再接受答案。 - LolaRun
1
是的,开发自己的(二进制)文档格式是使用更低级别的序列化类型工具,如NSCoder框架的典型情况。 - MrTJ
我知道这是一个较旧的帖子,但我想增加一些见解。老实说,我认为简单性和安全性也应该作为关键点。 - Clay
非常有帮助的答案 :) - MikeJ

9

Mattt Thompson在NSHipster上提供了关于NSCoding、Core Data和NSKeyedArchiver之间不同之处的易于理解的分析:http://nshipster.com/nscoding/


3

对象和关系结构之间总是存在阻抗。由于数据访问通常只占应用程序功能的一小部分,因此我始终更喜欢对象。使用NSCoding,您可以获得简单性、易于调试以及控制,而且您需要编写的代码很少。您还可以灵活地将NSCoding纳入数据库结构中。

NSCoding是用于保存对象的持久性机制。如果您为搜索优化添加索引并维护对象结构,则认为你可以以非常低的成本和易于维护的方式获得所有最佳方案。


2

除了已经给出的很好的答案,NSCoding与NSKeyedArchiver一起使用是存储数据的绝佳方式,这些数据对于NSUserDefaults来说太大(或不兼容的数据类型),但对于CoreData来说又太小且不是很多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接