iOS中的数据持久化
iOS中的数据持久化
数据持久化是应用开发中的重要部分,博主在编写一个网易彩票app的demo时(项目可以在我的github上找到,WYLottery)使用到了数据持久化来保存用户的设置,设置界面搭建也是借助plist文件来保存层次和属性,今天来整理一下iOS中数据持久化的方案与原理。iOS中的数据持久化的方案主要包括:NSUserDefault简单数据快速读写、Property list属性列表文件存储、Archive归档、SQLite本地数据库和CoreData。
数据持久化方案
NSUserDefault与Archive归档
NSUserDefault是iOS系统提供的一个单例类,采用简单的键值对存储方式,将用户的偏好设置保存到应用包的plist中,同时也能从中读取。添加新数据时需要自定义key和对应的基本类型的数据,获取时通过自定义key来获取,若不存在对应key则返回默认值(0或-1)。虽然存储的时基本类型数据,但我们也可以将集合数据转化成JSON字符串,以NSString的类型保存,通过这样来存储集合数据,便于加密解密。
通过+standardUserDefaults来获取NSUserDefault单例。通过-setObject:ForKey:和-object:ForKey:来存取数据。
序列化和归档(Archive),指的是将程序语言的对象转化成二进制流从而存储到文件中,因为对象不可以直接存储,反序列化和反归档(Unarchive)则反之。NSKeyedUnarchiver类继承自NSCoder,可以将满足NSCoding协议的对象进行归档,和NSData类型进行相互转换。若要实现多个对象同时归档和反归档,可以自定义并初始化一个NSKeyedArchiver对象,将数据封装在NSMutableData中进行统一的归档和反归档。
如果要想通过NSUserDefault保存自定义对象,需要做以下额外操作:
- 保证自定义类遵循NSCoding协议并实现协议进行编码/反编码;
- 使用NSKeyedUnarchiver类将自定义对象转换成NSData对象。
这样自定义对象转化成了NSData,就可以用NSUserDefault存储了,只不过取数据的时候需要NSKeyedUnarchiver来解档还原。归档成NSData对象的对应的归档解档方法(也可以调用别的方法归档成.achiver文件)分别为+archivedDataWithRootObject:与+unarchiveObjectWithData:。
Property list文件存储
Property List文件,扩展名为.plist,所以常被称为plist文件。主要用来存储序列化后的对象,文件是xml格式的,常用于存储用户的设置信息,也可以用于存储捆绑的信息等。
在使用plist文件存储前先要明确数据的不同存储位置:
-
存储到应用沙盒(可写可读,详见后文),沙盒是应用的隔离区域,plist存储在沙盒的Documents文件目录下,写入时要指明plist文件的文件名,如“/demo.plist”
-
存储到应用工程本身(只可读)。如果是将数据存在工程里,那么plist数据文件是手工创建的,而非代码添加,代码只对手工创建的plist文件进行读取且不可更新,更新只能通过手动修改plist文件更新数据。
读取工程plist文件并写入沙盒以及读取沙盒plist文件
SQLite本地数据库
iOS中的SQLite是一个使用ANSI-C开发的自包含的关系型数据库,它可以用于存储大规模的数据。SQLite的操作管理很简单,有小巧、快速、可靠的特点。另外SQLite使用互斥来保证多线程环境下数据操作的安全性。
SQLite源代码是一个叫sqlite3.c的文件,在使用时只要加入这个库文件同时在代码中引入sqlite.h头文件即可
CoreData
CoreData是苹果公司提供的一种应用数据管理框架,可以用图形界面的方式快速地定义App的数据类型,同时在代码中很容易获取这些数据类型。CoreData提供了基础结构用于处理常用的功能,如保护、恢复、撤销和重做,允许在App中继续创建新的任务。在使用CoreData的时候,不需要安装额外的数据库系统,因为CoreData使用内置的SQLite数据库。
CoreData的最本质特点是提供了一种将对象模型和关系数据进行映射的功能,称为对象-关系映射(ORM),可以将模型对象和关系数据相互转换在SQLite数据库中存取。
沙盒机制
沙盒是应用程序中一块相对封闭的独立空间,需要通过特殊限制通道才能访问沙盒外系统的资源。沙盒是为了系统安全而设置的访问屏障,限制应用程序访问系统文件、系统偏好、网络资源和硬件设备等,沙盒内的应用不会对系统安全有威胁。应用程序只能访问自己的沙盒,应用程序之间禁止数据的共享和访问。
沙盒的子目录
Documents目录
主要用于存储非常大的文件或需要非常频繁更新的数据,目录中的文件可以进行iTunes或iCloud的备份。
Library目录
Library目录下后Preferences和Cache目录,如其名,Preferences目录主要用于存储应用程序的偏好设置数据,可以进行iTunes或iCloud的备份。而Caches目录不可以进行iTunes或iCloud的备份,主要用于存放存储体积大、不需要备份的数据缓存文件。
tmp目录
tmp目录是应用程序的临时目录,里面的文件不可以进行iTunes或iCloud的备份,而且这里面的文件可能会随时被系统清除。
虽然不能直接访问其他应用程序中的数据,但是可以借助iOS提供的特定的API访问一些特殊应用,如联系人应用等。