在iOS开发中,所谓的数据持久化存储,就是将数据保存在硬盘中,这样即使我们的应用关闭后重启,仍然是可以继续访问之前保存的数据. 在iOS开发中,最常见的就是以下几种存储方案.
常见的几种存储方案
1, plist(属性列表)文件
2, Preference(偏好设置)
3, NSKetedArchiver(归档)
4, FMDB(基于SQLite3 封装的一套OC的API库)
5, CoreData
一、 沙盒结构介绍
首先需要了解一下Bundle和沙盒(sandbox)之间的区别:
Bundle: 应用程序在手机中的安装路径
sandbox(沙盒):专门来存储当前APP自己的数据的路径
-
沙盒机制:在iOS中每个APP都拥有自己的沙盒,APP只能访问对应沙盒中存储的数据, iOS是不允许跨越沙盒去访问数据的,所有的数据都是保存在该沙盒的三个子目录下:
Document
Library(Library/Caches, Library/Preference)
temp-
Document: 一般在该目录下保存一些比较重要的数据,比如:游戏相关的数据, 当连接iTunes后会自动同步数据
注意点: 如果将数据资源保存到该目录.上架可能会被拒绝,(解决方案:直接设置该文件夹不被iTunes备份),总之:不能保存从网上下载的数据,否则不能上架
-
Library: 存储应用设置或者状态信息等,在该目录下还有两个子目录:Caches和Preference
Library/Caches: 存放缓存文件,iTunes不会备份,因此文件不会因APP退出而删除(一般使用SDWebImage的缓存资源都是保存到这来)
Library/Preference: 保存应用的所有偏好设置,iOS的Setting(设置)会在该目录查找该应用的设置信息,iTunes会同步数据 - temp: 临时文件, iTunes不会备份该文件夹中的数据, 这个文件夹中的数据,会因为应用的关闭而删除.
-
-
如何获取到对应目录下的路径
参数1: 指定搜索的路径名称:是个枚举值:
NSDocumentDirectory: 表示在Document中寻找数据
NSCachesDirectory: 表示在caches中寻找
参数2: 也是个枚举值:
NSUserDomainMask: 表示在用户的主目录
NSLocalDomainMask: 表示在当前的机器
NSNetworkDomainMask: 表示网络中可见的主机
NSSystemDomainMask: 表示系统目录,不可修改
NSAllDomainsMask: 表示所有
参数3, 是否展开波浪线
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory(参数1), NSSearchPathDomainMask(参数2), BOOL(参数3))
//2.主目录
NSString *home = NSHomeDirectory();
//3.文档目录
//3.1拼接字符串
NSString *docDir1 = [NSString stringWithFormat:@"%@/%@",home,@"Documents"];
//3.2拼接路径(一般处理路径拼接建议使用此方法)
NSString *docDir2 = [home stringByAppendingPathComponent:@"Documents"];
NSString *docDir3 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//这个目录是在Library目录下的,需要自己手动创建文件夹(一般不会存在这个下面)
NSString *docError = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
//4.缓存目录
NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
//5.临时目录
NSString *tempDir = NSTemporaryDirectory();
- 数据持久化存储的几种方式简单介绍
在iOS开发中,苹果提供了4中数据持久化方案供我们选择,分别是: 属性列表(plist), 数据归档(NSKeyedValueArchiver/NSUserDefaults), 数据库(splite)以及coreData.
plist文件存储:
plist是一种明文的轻量级存储方式,最常用的格式是XML格式,比如:新疆一个项目是,系统会提供一个info.plist文件,这种方式的安全性几乎为0,所提plist主要是用于存储少了并且不重要的数据. plist只能读取数组(NSArray)或者字典(NSDictonary).
数据归档/序列化(NSKeyedArchiver):
NSKeyedArchiver是一种轻量级存储的持久化方案,数据化归档时经过加密处理的,所以安全性远高于plist,数据归档可以存储一些复杂的对象,数据保存前会经过二进制处理.注意:使用这种方案是需要前提的, 使用前必须要遵守NSCoding协议并且实现协议中的两个方法.
数据库(splite):
splite是一个轻量级,跨平台的小型数据库,可移植性比较高,有着和MySpl几乎相同的数据库语句,以及无需服务器即可使用的优点:
数据库的优点:
1, 该方案可以存储大量的数据,存储和检索的速度非常快.
2, 能对数据进行大量的聚合,这样比起使