#数据持久化 ##1、文件管理 ###1.1iOS沙盒机制:
iOS应⽤用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码⽂件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件 等。
• 每个应⽤程序都有⾃己的存储空间
• 应⽤程序不能翻过自⼰的围墙去访问别的存储空间的内容
• 应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
通过这张图只能从表层上理解sandbox是一种安全体系,应⽤程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应⽤程序执行各种操作的权限限制。
- 应用沙盒路径
// 沙盒目录路径
NSString *homePath = NSHomeDirectory();
// Documents 目录
NSString *documentsPath = [homePath stringByAppendingPathComponent:@"Documents"];
###1.2目录结构: 默认情况下,每个沙盒含有3个⽂件夹:Documents, Library 和 tmp。因为应⽤用的沙盒机制,应⽤只能在⼏个目录下读写文件
- Documents:苹果建议将程序中建⽴的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢 复的时候会包括此目录
// 获取Documents目录
- (NSString *)docPath {
/** NSSearchPathForDirectoriesInDomains: 获取文件目录路径
参数一: 要获取的目录名称
参数二: 要查找的目录的主目录(沙盒目录)
参数三: 是否返回完整的路径
**/
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
- Library:存储程序的默认设置或其它状态信息;(iTunes备份和恢复的时候会包含此目录)
// 获取 Library目录
- (NSString *)libPath {
return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
}
- Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
// 获取缓存目录路径
- (NSString *)cachesPath {
return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}
- tmp:提供一个即时创建临时⽂件的地⽅方。(系统重启后会删除tmp里的所有文件)
// 获取Tem目录
- (NSString *)temPath {
return NSTemporaryDirectory();
}
###1.3文件操作:
- 获取程序的Home路径
- 获取Documents路径
- 获取Library路径
- 获取缓存路径
- 获取tmp路径
- ⽂件写入
- ⽂件读取
- 删除文件
###1.4沙盒目录代码下载 沙盒目录代码下载
##2、属性列表 概述:
使⽤属性列表持久化数据对象非常⽅便,只要是数组或者字典中包含的对象是特定的
可序列话对象(包括NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData, NSMutableData,NSString,NSMutableString,NSNumber,NSDate),就可以直接通过NSDictionary和NSArray的实例⽅法将其保存到属性列表或者从属性列表中读取他们。
示列代码
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [docPath stringByAppendingPathComponent:@"userInfo.plist"];
NSMutableDictionary *userInfos = [NSMutableDictionary dictionary];
[userInfos setObject:@"admin" forKey:@"userName"];
[userInfos setObject:@"55244646435@qq.com" forKey:@"email"];`
1、将字典数据写入plist文件
BOOL isSuccess_1 = [userInfos writeToFile:filePath atomically:YES];
NSString *filePath_array = [docPath stringByAppendingPathComponent:@"i"];
NSArray *infos = @[@"1",@"2",@"3"];
2、将数组数据写入plist文件
BOOL isSuccess_2 = [infos writeToFile:filePath_array atomically:YES];
if (isSuccess_2) {
NSLog(@"数据写入成功");
} else {
NSLog(@"写入失败");
}
3、获取本地路径的plist文件
NSArray *infos_ = [NSArray arrayWithContentsOfFile:filePath_array];
// NSDictionary *userInfos = [NSDictionarydictionaryWithContentsOfFile:filePath];
NSUserDefaults 系统提供的plist文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
设值
[userDefaults setObject:@100 forKey:@"id"];
[userDefaults setBool:YES forKey:@"isLoad"];
[userDefaults setDouble:3.8408 forKey:@"price"];
同步数据代码
[deaults synchronize];
取值
id value = [userDefaults objectForKey:@"id"];
NSLog(@"%@",value);
修改
[userDefaults setObject:@2000 forKey:@"id"];
[userDefaults synchronize];
###2.1属性设置代码下载
##3、对象归档
概述:
对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使⽤的 时候读取该文件的保存路径读取文件的内容(也称为接档,反序列化), (对象归档的文件是保密的,在磁盘上⽆法查看文件中的内容,⽽属性列表是明⽂的,可 以查看)。
###3.1对象归档⽅方式:
- 简单归档
- 对多个对象进⾏行归档
- 对⾃自定义对象进⾏行归档
1、使用 NSKeyedArchiver 进行编码归档
//1、创建文件保存路径
NSString *dicPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [dicPath stringByAppendingPathComponent:@"data.archive"];
//2、设置保存的数据
NSMutableArray *infos = [NSMutableArray array];
[infos addObject:@"One"];
[infos addObject:@100];
[infos addObject:[NSDate date]];
//3、将数据归档到指定路径
[NSKeyedArchiver archiveRootObject:infos toFile:filePath];
2、解归档(读取解码): NSKeyedUnarchiver
id object = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
User *user_ = (User *)object;
NSLog(@"%@ %@",user_.userName, user_.password);
###3.2 自定义对象归档 有时候我们需要本地保存自己定义的一些对象数据,这些对象并没有实现<NSCoding>协议,所以在归档数据前要先去实现<NSCoding>协议中的方法,在协议方法中对自定义对象属性的编码和解码。如下实现自定义的User类对象的归档:
.h中设置属性并实现<NSCoding>协议
@interface User : NSObject <NSCoding>
@property (nonatomic, copy) NSString *userName;
@property (nonatomic, copy) NSString *password;
@end
对属性编码和解码
.m文件中实现协议方法,encodeWithCoder: 和 initWithCoder:完成对属性数据的编码和解码。
// 编码
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_userName forKey:@"userName"];
[aCoder encodeObject:_password forKey:@"password"];
}
// 解码
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self ) {
self.userName = [aDecoder decodeObjectForKey:@"userName"];
self.password = [aDecoder decodeObjectForKey:@"password"];
}
return self;
}
@end
###3.3对象归档代码下载