
# 数据持久化方案

## 功能
主要将一些网络获取下来的数据保存到 App 本地，增强用户体验、减小网络请求的次数。


| 方案 | 存储量 | 数据类型 | 数据载体 | 特点 | 场景 | 缺点 |
|:-:| :-: | :-: | :-: | :-:| :-:| :-: |
| plist | 适合存储小数据量、并且属于一类的列表类的数据 | 基本数据类型、不支持存储自定义的对象 |  直接在plist文件上操作（可见） | 量小、不常变动| 省市列表、职场工作分类| 所有数据都存放在 root dictionary 里，每次都需要将整个 dictiona 读取出来访问所需的对象。数据较大的时候很费时间和空间 | 
| 归档 | 存储数据量较大的数据对象 | 遵循NSCoding、NSCopying协议的对象| 必须依赖NSKeyedArchieve、NSUnKeyedArchieve的类方法或者对象方法进行存储 | 存储较为麻烦，需要实现对应的协议。归档需要实现`-(void)encodeWithCoder:(NSCoder*)aCoder;`解码需要实现`-(id)initWithCoder:(NSCoder*)aDecoder;`。除了遵循NSCoding协议外，对象要实现复制，需要实现`-(id)copyWithZone:(NSZone *)zone;` | 存储一些较小的数据 | 无法存储较大的数据和高效的查找 | 
| NSUserDefault（偏好设置） | 适合存储数据量较少，有时也会存储一些比如状态开关的标准性值 | 存储OC所有的数据类型| 实例对象、基本数据 | 利用| App应用程序的配置信息、如版本号、app名称、用户权限、标志键值等| 无法存储自定义的对象 |
| 沙盒存储 | 存储较大量数据量的数据 | 基本存储 NSData 类型的数据| 文件 |依赖NSFileManager进行文件的写入和读取，过程较为复杂。Application:存放程序源代码，上架前经过数字签名，上架后不可修改。Documents：保存App运行时生成的需要持久化的数据，iTunes同步设备会同步该目录。例如将游戏数据保存到该目录下。tmp：保存App运行时产生的临时数据，程序结束将文件从该目录删除。iTunes同步设备不会同步该目录。Library/Caches：保存应用运行时生成的需要持久化的数据，iTunes同步设备时不会同步该目录。一般体积大、不需要备份的非重要数据，比如网络数据的缓存。Library/Preference：保存应用的偏好设置，比如OS的设置应用会在该目录下查找用户的设置信息。iTunes同步设备会同步该目录 | 图片、音视频。比如SDWebImage的文件缓存| 缓存太多，文件体积会非常大 |
| 数据库 | 存储大型数据量的数据 | OC所有的数据类型| 数据库文件 | 数据的增删改查，较为强大的数据库批量处理指令，SQL| 几乎每个大型App都有自己的数据库，比如微信、微博，为了较好的用户体验在每个小细节都有数据库技术| 需要新建数据库、建立连接、处理数据、关闭数据库连接。也不支持自定义的对象存储 |


## 2个概念：Relation、Object
