进入正题之前,先要了解iOS的>沙盒(sandbox)<
它的特点如下:
1.每个程序都在自己的沙盒内
2.不能随意跨越沙盒去访问别的程序沙盒内容
3.应用程序向外请求或者获取数据都要经过权限认证
4.所有非代码文件都保存在沙盒内,比如图片,声音,属性文件等.
不难看出,沙盒机制让iOS相对其他系统更加安全,让程序之间的通讯受到管理.沙盒中的目录结构:
1.Documents
存放内容:程序运行时生成的一些需要长久保存的,不可再生的数据(游戏进度,应用程序个人设置等)
是否会被iTunes同步:会
2.Library
2.1.Library/Caches
存放内容:用户使用过程中的缓存文件,可再生(网络请求数据),App需要有对应的删除Caches的功能.
是否会被iTunes同步:不会
2.2Library/Preference:应用程序的偏好文件,使用>NSUserDefaults<保存的设置数据都会保存在这个文件夹下.
是否会被iTunes同步:会
3.tmp
存放内容:各种临时文件,App再次运行时主动删除,系统也会在磁盘空间不足时主动清理.
是否会被iTunes同步:不会
获取沙盒相关目录路径
获取沙盒目录
NSHomeDirectory()
获取tmp目录
NSTemporaryDirectory()
获取Documents和Library目录
NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)
这个方法用户返回指定范围内的指定目录的路径,包括三个参数:
1.directory:要搜索的目录名称,比如使用NSDocumentDirectory表明想要查找Documents目录;使用NSCachesDirectory表明想要查找Library/Caches目录
2.domainMask:指定搜索范围,比如使用NSUserDomainMask表明想要在当前应用沙盒目录下查找;NSLocalDomainMask表明想要查找/Library等.
3.expandTilde:返回一个BOOL值,表示是否展开"~"符号,返回全路径
//返回YES
"/Users/mac/Library/Developer/CoreSimulator/Devices/466710BC-3138-45F4-ADCD-FC14379107AC/data/Containers/Data/Application/EB044A4C-1454-4A12-BBB1-EF14E06C681F/Documents"
//返回NO
"~/Documents"
数据存储
plist
拼接文件路径和名称
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"fileName.plist"];
- 存储数据:
[dataArray writeToFile:filePath atomically:YES];
第一个参数: 文件全路径
第二个参数: YES, 在写入文件的时候, 会先写入一个临时文件, 当所有数据完成写入过之后, 会把这个文件名修改为要保存的文件名, 如果写入失败, 则不修改.
- 读取数据:
[NSArray arrayWithContentsOfFile:filePath]
可以调用writeToFile的类:
NSUserDefaults
很多iOS应用都支持偏好设置,比如保存用户名/密码/字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能,
每个应用都有个NSUserDefaults实例,它是一个单例对象,通过它来存取偏好设置,设置信息都是键值对的形式,
UserDefaults主要用来存储用户系统的设备信息,但有的时候也可以在程序的任何地方用来存储>轻量级<数据,作为全局数据来访问.
不用程序猿管理存储的目录和路径
存储数据:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"Key"];
- 读取数据:
[[NSUserDefaults standardUserDefaults] boolForKey:@"Key"];
UserDefaults支持的数据类型:
归档&解档
要了解归档/解档,需要先了解NSCoding协议,苹果官方给出的描述如下:
- The NSCoding protocol declares the two methods that a class must implement so that instances of that class can be encoded and decoded. This capability provides the basis for archiving (where objects and other structures are stored on disk) and distribution (where objects are copied to different address spaces).
- NSCoding协议声明了两个方法,一个类想要实现归档/解档必须要遵守NSCoding协议.一旦遵守,就可以归档(对象存储在磁盘上)和解档(对象可以复制到不同的位置)
需要注意的是:所有原生的类都已经遵守了<NSSecureCoding>协议,所以可以直接归档/解档
- 存储数据:
[NSKeyedArchiver archiveRootObject:object toFile:filePath];
- 读取数据:
[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
如果是自定义类:Person
@interface Person : NSObject <NSCoding>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign)NSInteger age;
@end
想要归档/解档,除了要遵守NSCoding协议,还要在>类内部<实现两个方法:
- 归档器:
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
- 解档器
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
[aDecoder decodeObjectForKey:@"name"];
[aDecoder decodeObjectForKey:@"age"];
return self;
}
数据库
- 有别于系统提供的数据存储方式,可以进行大批量数据的增/删/改/查.
- 数据库结构类似Excel表格
- iOS系统使用的是轻量级的SQLite数据库
篇幅较大,以后专门开一篇博来分享.