前言
iOS中常用的持久化存储方式有好几种:
每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用必须待在自己的沙盒里,其他应用不能访问该沙盒。沙盒下的目录如下:
- Application:存放程序源文件,上架前经过数字签名,上架后不可修改
- Documents: 保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
- tmp: 保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用 没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。
- Library/Caches: 保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份 该目录。⼀一般存储体积大、不需要备份的非重要数据,比如网络数据缓存存储到Caches下
- Library/Preference: 保存应用的所有偏好设置,如iOS的Settings(设置) 应⽤会在该目录中查找应⽤的设置信息。iTunes同步设备时会备份该目录
NSUserDefaults
NSUserDefaults是个单例类,用于存储少量数据。NSUserDefaults实际上对plist文件操作的封装,更方便我们直接操作,一般用于存储系统级别的偏好设置。比如我们经常将登录后的用户的一些设置通过NSUserDefaults存储到plist文件中。
plist存储
主要保存的数据类型为NSString、NSNumber、NSData、NSArray、NSDictionary、NSMutableArray、NSMutableDictionary、NSMutableData.有的时候,我们需要将下载的数据存储到文件中存储起来,比如,有时候我们将下载起来的城市的数据存储到本地,当更新城市的顺序时,下次也能够按照最后一次操作的顺序来显示出来。
归档(NSKeyedArchiver)
一般保存自定义的对象,自定义对象数组,但是只有遵守NSCoding的类才能只用归档。如果使用MJExtension可以不用写复杂的NSCoding协议,只需要一句MJCodingImplementation即可。
KeyChain
用来存加密数据,这个与其他存储方式不同的是:即使删除掉app数据也不会消失,因为它存在一个/private/var/keychains/keychain-2.db的数据库文件中,这是一个系统文件,所以删除app,它不会消失。不过不适合大量数据的持久化存储
CoreData
对象持久化,用来保存程序用到的对象及对象间的关联。CoreData是对SQLite的封装,本质还是数据库存储,将OC对象转化成数据保存在数据库中。好处就是能够合理管理内存,避免sql语句的麻烦
SQLite3
SQLite是一款轻型的嵌入式数据库,安卓和ios开发使用的都是SQLite数据库.
iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦,于是就出现了一系列将SQLite封装的库。本文讲解的FMDB就是其中的一个。
优点:
对多线程的并发操作进行了处理,所以是线程安全的
以OC的方式封装了SQLite的C语言API,使用起来更加方便
FMDB是轻量级框架 使用灵活
缺点:
因为它是OC的语言封装的,只能在ios开发的时候使用,所以在实现跨平台操作的时候存在局限性。
日常使用WCDB:https://github.com/Tencent/wcdb/wiki