我一直在寻找一篇文章,解释NSCoding (NSKeyedArchiver...) 与使用CoreData (SQLite...) 的优缺点。
有很多选项,我可以实现自己的自定义二进制读写器,或使用plists/xml/json... 或使用SQLite或NSCoding。
我现在有点迷失了。有人能解释一下主要特点之间的区别吗?
我一直在寻找一篇文章,解释NSCoding (NSKeyedArchiver...) 与使用CoreData (SQLite...) 的优缺点。
有很多选项,我可以实现自己的自定义二进制读写器,或使用plists/xml/json... 或使用SQLite或NSCoding。
我现在有点迷失了。有人能解释一下主要特点之间的区别吗?
这取决于您要保存哪种类型的数据以及是否仅在内部使用,还是需要与外部服务交换数据。
NSCoding通常是一种数据序列化器。许多内置对象实现了NSCoder协议,允许您将它们保存为二进制流(文件,在sqlite的BLOB中等)。 NSKeyedArchiver通过基于字符串标签搜索这些流,类似于字典但只能使用字符串作为键。如果您偶尔必须持久化不同类别的某些对象,则此方法很好。
但是,如果您有许多相同类别的对象,则最好采用数据库方法,例如SQLite或CoreData。 CoreData实际上是围绕SQLite的包装器,可以方便地设计数据模型,并在幕后执行对数据库的查询,无需编写SQL语句。在CoreData中,您定义自己的类,并且可以持久化类的每个实例,即使没有始终保存在内存中的对象成员的值也可以获取回来。这是一种非常方便的存储大量结构化数据的方式。例如,如果您编写一个Web浏览器,则可以使用名称,URL和最后访问时间存储用户的书签。
对于XML和JSON,如果仅在设备本地使用数据,则没有特殊优势。如果您需要与某些外部服务通信,则可能考虑缓存/保存XML / JSON对象以供以后使用。另一种方法是每次需要时从您的内部数据结构(见上文)重新生成此数据。
如果您自己设计数据模型,则我认为使用plist的意义甚至更小,但也许有人会纠正我。
编辑:我在这里添加了一个短链接,用于教程,讲解如何使用NSCoding、Core Data以及额外的SQLite。
更新于12.01.2016: 如果您正在寻找持久性解决方案,建议您也查看Realm。
Mattt Thompson在NSHipster上提供了关于NSCoding
、Core Data和NSKeyedArchiver
之间不同之处的易于理解的分析:http://nshipster.com/nscoding/
对象和关系结构之间总是存在阻抗。由于数据访问通常只占应用程序功能的一小部分,因此我始终更喜欢对象。使用NSCoding,您可以获得简单性、易于调试以及控制,而且您需要编写的代码很少。您还可以灵活地将NSCoding纳入数据库结构中。
NSCoding是用于保存对象的持久性机制。如果您为搜索优化添加索引并维护对象结构,则认为你可以以非常低的成本和易于维护的方式获得所有最佳方案。
除了已经给出的很好的答案,NSCoding与NSKeyedArchiver一起使用是存储数据的绝佳方式,这些数据对于NSUserDefaults来说太大(或不兼容的数据类型),但对于CoreData来说又太小且不是很多。
NSCoding
的可转换属性上的 NSCoding 方法,并将该属性转换为二进制 blob,可以保存在 Core Data 中。更多信息请参见 Do all attributes with a custom type in core-data have to be a relationship?。 - mfaani