#数据持久化 ##一、文件管理 ###1.1iOS沙盒机制:
iOS应⽤用程序只能在为该改程序建立的文件系统中读取文件,不能够去其它地方访问,此区域被成为沙盒,因此全部的非代码⽂件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件 等。
• 每一个应⽤程序都有⾃己的存储空间
• 应⽤程序不能翻过自⼰的围墙去访问别的存储空间的内容
• 应用程序请求的数据都要经过权限检测,假如不符合条件的话,不会被放行。git
经过这张图只能从表层上理解sandbox是一种安全体系,应⽤程序的全部操做都要经过这个体系来执行,其中核心内容是:sandbox对应⽤程序执行各类操做的权限限制。github
// 沙盒目录路径 NSString *homePath = NSHomeDirectory(); // Documents 目录 NSString *documentsPath = [homePath stringByAppendingPathComponent:@"Documents"];
###1.2目录结构: 默认状况下,每一个沙盒含有3个⽂件夹:Documents, Library 和 tmp。由于应⽤用的沙盒机制,应⽤只能在⼏个目录下读写文件数组
// 获取Documents目录 - (NSString *)docPath { /** NSSearchPathForDirectoriesInDomains: 获取文件目录路径 参数一: 要获取的目录名称 参数二: 要查找的目录的主目录(沙盒目录) 参数三: 是否返回完整的路径 **/ return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; }
// 获取 Library目录 - (NSString *)libPath { return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; }
// 获取缓存目录路径 - (NSString *)cachesPath { return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; }
// 获取Tem目录 - (NSString *)temPath { return NSTemporaryDirectory(); }
###1.3文件操做:缓存
###1.4沙盒目录代码下载 沙盒目录代码下载安全
##二、属性列表 概述:
使⽤属性列表持久化数据对象很是⽅便,只要是数组或者字典中包含的对象是特定的
可序列话对象(包括NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData, NSMutableData,NSString,NSMutableString,NSNumber,NSDate),就能够直接经过NSDictionary和NSArray的实例⽅法将其保存到属性列表或者从属性列表中读取他们。编码
示列代码atom
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"];`
一、将字典数据写入plist文件code
BOOL isSuccess_1 = [userInfos writeToFile:filePath atomically:YES]; NSString *filePath_array = [docPath stringByAppendingPathComponent:@"i"]; NSArray *infos = @[@"1",@"2",@"3"];
二、将数组数据写入plist文件对象
BOOL isSuccess_2 = [infos writeToFile:filePath_array atomically:YES]; if (isSuccess_2) { NSLog(@"数据写入成功"); } else { NSLog(@"写入失败"); }
三、获取本地路径的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.1对象归档⽅方式:
一、使用 NSKeyedArchiver 进行编码归档
//一、建立文件保存路径 NSString *dicPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath = [dicPath stringByAppendingPathComponent:@"data.archive"]; //二、设置保存的数据 NSMutableArray *infos = [NSMutableArray array]; [infos addObject:@"One"]; [infos addObject:@100]; [infos addObject:[NSDate date]]; //三、将数据归档到指定路径 [NSKeyedArchiver archiveRootObject:infos toFile:filePath];
二、解归档(读取解码): 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对象归档代码下载