NSCoding VS核心数据

时间:2012-03-05 15:40:13

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

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

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

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

4 个答案:

答案 0 :(得分:31)

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

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

但是,如果您拥有相同类的许多对象,那么最好选择数据库方法,SQLite或CoreData。 CoreData实际上是SQLite的一个包装器,它可以简化设计数据模型的大量工作,并且可以在窗帘后面对DB进行查询,而无需编写SQL语句。在CoreData中,您可以定义类,并且可以保持类的每个实例,即您可以返回对象成员的值,而不必始终在内存中。这是存储大量结构化数据的一种非常方便的方法。例如,如果您要编写Web浏览器,则可以使用名称,URL以及上次访问时间来存储用户的书签。

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

如果你自己设计数据模型,我发现使用plist的意义更少,但也许有人会纠正我。

编辑:我在这里添加了一个简短的链接参考,以获取有关如何使用NSCodingCore Data的教程,以及作为奖励的SQLite

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

答案 1 :(得分:9)

Mattt Thompson对NSHipster中NSCoding,核心数据和NSKeyedArchiver之间的各种差异提供了可消解的细分:http://nshipster.com/nscoding/

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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