数据存储(数据持久化)
1.iOS应用数据存储的常用方式
XML属性列表(plist)归档
Preference(偏好设置)
NSKeyedArchiver归档(NSCoding)
SQLite3
Core Data
2.应用沙盒
1> 每个iOS应用都有自己的应用沙盒,应用沙盒就是应用的文件夹,与其他文件系统隔离。
2> 应用必须待在自己的沙盒里,其他应用不能访问该沙盒
3> 应用沙盒的路径
one: 点击前往->RHP(个人电脑名)->资源库->Application Support->iPhone Simulator-> 7.1 ->里面全是应用沙盒
two: 用代码打印应用的沙盒路径: NSLog ( @"%@" , NSHomeDirectory ());
4>应用沙盒文件系统
应用的名称是Layer

应用程序包(图中的Layer): 包含了所有的 资源文件 ( 图片 ,plist等)和可执行文件
注意: xcode6以后在Bundle—>Application—>显示包内容
Documents: 保存应用运行时生成的需要 持久化的数据 (保存比较重要的数据),iTunes同步设备时 会备份 。
tmp: 保存 临时数据 ,使用完毕后就删除,应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会备份。
Library/Caches: 缓存 ,一般存储体积大、不需要备份的非重要数据,iTunes同步设备时 不会备份
Library/Preference :保存应用的所有 偏好设置 ,一般由系统管理,但也可以自行管理,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时 会备份
3.plist存储
1>plist存储注意
one. 只有writeToFile对象才能做plist存储
two. 以什么类型存储的,就以什么类型读取
three. 路径必须展开,不然无法进行plist存储
four. 自定义对象不能通过plist存储
2>plist存储步骤
one. 获取Documents步骤
two. 拼接路径名
three. 使用writeFile写入,或文件的contentWith方法读取
//存储
- ( IBAction )save:( id )sender {
/*
1.获取Documents路径 —> NSSearchPathForDirectoriesInDomains方法
1>方法名理解: SearchPath:搜索路径:ForDirectories:搜索哪个文件夹 InDomains在哪个范围
2>参数含义
directory: 搜索哪一个文件.NSDocumentDirectory:Document文件夹
domainMask: 在哪个范围内搜索:NSUserDomainMask 在用户的范围下搜索
expandTilde: 是否展开路径:yes展开 No不展开 ~代替沙盒路径(不展开时不能使用plist存储文件)
*/
NSString *path= NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory , NSUserDomainMask , YES )[ 0 ];
//2.拼接路径名
NSString *filePath=[path stringByAppendingPathComponent : @"data.plist" ];
//3.使用writeToFile写入
NSArray *arr= @[ @"1" , @"2" , @"3" ] ;
[arr writeToFile :filePath atomically : YES ];
}
//读取
- ( IBAction )read:( id )sender {
//1.获取Document路径
NSString *path= NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory , NSUserDomainMask , YES )[ 0 ];
//2.拼接路径名
NSString *filePath=[path stringByAppendingPathComponent : @"data.plist" ];
//3.用文件对应格式的arrayWithContentsOfFile读取
NSArray *arr=[ NSArray arrayWithContentsOfFile :filePath];
NSLog ( @"%@" ,arr);
}
4.偏好设置存储
1>优点:
one> 不关心文件夹,统一存储在NSUserDefaults(Library/Preferences)
two> 快速进行键值对存储
2>缺点 :不能及时存储,必须做同步操作,把内存中的数据同步到硬盘上。
//保存
- ( IBAction )save:( id )sender {
//3>NSUserDefaults 单例对象
//偏好设置(NSUserDefaults)底层:就是封装了一个字典
NSUserDefaults *userDeafult=[ NSUserDefaults standardUserDefaults ];
//4>同步(把缓存里面的偏好设置文件写入硬盘)
//ios8之前,用偏好设置必须要同步,不会马上写入硬盘,为适配ios7.8要做同步
[userDeafult synchronize ];
//存储
[userDeafult setObject : @"rhp" forKey : @"name" ];
[userDeafult setObject : @"man" forKey : @"sex" ];
}
//读取
- ( IBAction )read:( id )sender {
NSUserDefaults *userDeafult=[ NSUserDefaults standardUserDefaults ];
//根据键读取
NSString *name=[userDeafult objectForKey : @"name" ];
NSString *sex=[userDeafult objectForKey : @"sex" ];
NSLog ( @"姓名:%@,性别:%@" ,name,sex);
}
5. 自定义对象归档接档
使用自定义归档接档对象必须要遵守 <NSCoding> 协议,实现归档和接档方法
RHP:是一个自定义对象
//1> 遵守<NSConding>协议
@interface RHP : NSObject < NSCoding ]]>
@property ( nonatomic , assign ) int age;
@property ( nonatomic , copy ) NSString * name;
@end
//2> 实现<NSConding>协议的归档接档方法
// 归档方法 :自定义对象归档的时候就会调用
//作用:标识对象里面哪些属性要归档
-( void ) encodeWithCoder :( NSCoder *)aCoder
{
//把对象属性归档
[aCoder encodeObject : _name forKey : @"name" ];
[aCoder encodeInt : _age forKey : @"age" ];
}
// 解档方法 :自定义对象解档的时候就会调用
//作用:标识对象里面那些属性要解档,怎么接档
-( id ) initWithCoder :( NSCoder *)aDecoder
{
if ( self =[ super init ]) {
//根据归档时的键解档,并给属性赋值
_name =[aDecoder decodeObjectForKey : @"name" ];
_age =[aDecoder decodeIntForKey : @"age" ];
}
return self ;
}
- ( IBAction )save:( id )sender {
//归档
//1.获取临时文件夹路径 temp
NSString *temp= NSTemporaryDirectory ();
//2.拼接文件路径
NSString *filepath=[temp stringByAppendingString : @"RHP.txt" ];
//4.创建自定义对象RHP
RHP *r=[[ RHP alloc ] init ];
r. name = @"呵呵" ;
//自定义对象归档
//归档底层实现:调用对象的encodeWithCoder方法
[ NSKeyedArchiver archiveRootObject :r toFile :filepath];
}
- ( IBAction )read:( id )sender {
//解档
NSString *temp= NSTemporaryDirectory ();
NSString *filepath=[temp stringByAppendingString : @"RHP.txt" ];
//3.自定义对象解档
//解档底层实现:调用对象的initWithCoder方法
RHP *r= [ NSKeyedUnarchiver unarchiveObjectWithFile :filepath];
NSLog ( @"%@" ,r. name );
}
1.iOS应用数据存储的常用方式
XML属性列表(plist)归档
Preference(偏好设置)
NSKeyedArchiver归档(NSCoding)
SQLite3
Core Data
2.应用沙盒
1> 每个iOS应用都有自己的应用沙盒,应用沙盒就是应用的文件夹,与其他文件系统隔离。
2> 应用必须待在自己的沙盒里,其他应用不能访问该沙盒
3> 应用沙盒的路径
one: 点击前往->RHP(个人电脑名)->资源库->Application Support->iPhone Simulator-> 7.1 ->里面全是应用沙盒
two: 用代码打印应用的沙盒路径: NSLog ( @"%@" , NSHomeDirectory ());
three:可使用软件找到应用沙盒
4>应用沙盒文件系统
应用的名称是Layer
应用程序包(图中的Layer): 包含了所有的 资源文件 ( 图片 ,plist等)和可执行文件
注意: xcode6以后在Bundle—>Application—>显示包内容
Documents: 保存应用运行时生成的需要 持久化的数据 (保存比较重要的数据),iTunes同步设备时 会备份 。
tmp: 保存 临时数据 ,使用完毕后就删除,应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会备份。
Library/Caches: 缓存 ,一般存储体积大、不需要备份的非重要数据,iTunes同步设备时 不会备份
Library/Preference :保存应用的所有 偏好设置 ,一般由系统管理,但也可以自行管理,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时 会备份
3.plist存储
1>plist存储注意
one. 只有writeToFile对象才能做plist存储
two. 以什么类型存储的,就以什么类型读取
three. 路径必须展开,不然无法进行plist存储
four. 自定义对象不能通过plist存储
2>plist存储步骤
one. 获取Documents步骤
two. 拼接路径名
three. 使用writeFile写入,或文件的contentWith方法读取
//存储
- ( IBAction )save:( id )sender {
/*
1.获取Documents路径 —> NSSearchPathForDirectoriesInDomains方法
1>方法名理解: SearchPath:搜索路径:ForDirectories:搜索哪个文件夹 InDomains在哪个范围
2>参数含义
directory: 搜索哪一个文件.NSDocumentDirectory:Document文件夹
domainMask: 在哪个范围内搜索:NSUserDomainMask 在用户的范围下搜索
expandTilde: 是否展开路径:yes展开 No不展开 ~代替沙盒路径(不展开时不能使用plist存储文件)
*/
NSString *path= NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory , NSUserDomainMask , YES )[ 0 ];
//2.拼接路径名
NSString *filePath=[path stringByAppendingPathComponent : @"data.plist" ];
//3.使用writeToFile写入
NSArray *arr= @[ @"1" , @"2" , @"3" ] ;
[arr writeToFile :filePath atomically : YES ];
}
//读取
- ( IBAction )read:( id )sender {
//1.获取Document路径
NSString *path= NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory , NSUserDomainMask , YES )[ 0 ];
//2.拼接路径名
NSString *filePath=[path stringByAppendingPathComponent : @"data.plist" ];
//3.用文件对应格式的arrayWithContentsOfFile读取
NSArray *arr=[ NSArray arrayWithContentsOfFile :filePath];
NSLog ( @"%@" ,arr);
}
4.偏好设置存储
1>优点:
one> 不关心文件夹,统一存储在NSUserDefaults(Library/Preferences)
two> 快速进行键值对存储
2>缺点 :不能及时存储,必须做同步操作,把内存中的数据同步到硬盘上。
//保存
- ( IBAction )save:( id )sender {
//3>NSUserDefaults 单例对象
//偏好设置(NSUserDefaults)底层:就是封装了一个字典
NSUserDefaults *userDeafult=[ NSUserDefaults standardUserDefaults ];
//4>同步(把缓存里面的偏好设置文件写入硬盘)
//ios8之前,用偏好设置必须要同步,不会马上写入硬盘,为适配ios7.8要做同步
[userDeafult synchronize ];
//存储
[userDeafult setObject : @"rhp" forKey : @"name" ];
[userDeafult setObject : @"man" forKey : @"sex" ];
}
//读取
- ( IBAction )read:( id )sender {
NSUserDefaults *userDeafult=[ NSUserDefaults standardUserDefaults ];
//根据键读取
NSString *name=[userDeafult objectForKey : @"name" ];
NSString *sex=[userDeafult objectForKey : @"sex" ];
NSLog ( @"姓名:%@,性别:%@" ,name,sex);
}
5. 自定义对象归档接档
使用自定义归档接档对象必须要遵守 <NSCoding> 协议,实现归档和接档方法
RHP:是一个自定义对象
//1> 遵守<NSConding>协议
@interface RHP : NSObject < NSCoding ]]>
@property ( nonatomic , assign ) int age;
@property ( nonatomic , copy ) NSString * name;
@end
//2> 实现<NSConding>协议的归档接档方法
// 归档方法 :自定义对象归档的时候就会调用
//作用:标识对象里面哪些属性要归档
-( void ) encodeWithCoder :( NSCoder *)aCoder
{
//把对象属性归档
[aCoder encodeObject : _name forKey : @"name" ];
[aCoder encodeInt : _age forKey : @"age" ];
}
// 解档方法 :自定义对象解档的时候就会调用
//作用:标识对象里面那些属性要解档,怎么接档
-( id ) initWithCoder :( NSCoder *)aDecoder
{
if ( self =[ super init ]) {
//根据归档时的键解档,并给属性赋值
_name =[aDecoder decodeObjectForKey : @"name" ];
_age =[aDecoder decodeIntForKey : @"age" ];
}
return self ;
}
- ( IBAction )save:( id )sender {
//归档
//1.获取临时文件夹路径 temp
NSString *temp= NSTemporaryDirectory ();
//2.拼接文件路径
NSString *filepath=[temp stringByAppendingString : @"RHP.txt" ];
//4.创建自定义对象RHP
RHP *r=[[ RHP alloc ] init ];
r. name = @"呵呵" ;
//自定义对象归档
//归档底层实现:调用对象的encodeWithCoder方法
[ NSKeyedArchiver archiveRootObject :r toFile :filepath];
}
- ( IBAction )read:( id )sender {
//解档
NSString *temp= NSTemporaryDirectory ();
NSString *filepath=[temp stringByAppendingString : @"RHP.txt" ];
//3.自定义对象解档
//解档底层实现:调用对象的initWithCoder方法
RHP *r= [ NSKeyedUnarchiver unarchiveObjectWithFile :filepath];
NSLog ( @"%@" ,r. name );
}
补充:向Cache中归档
1.
获取
cache
文件夹
NSString *cachePath= NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES )[ 0 ];
2. 拼接路径名
NSString *filepath=[cachePaths tringByAppendingString: @"contents.txt" ];
3. 归档
NSString *cachePath= NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES )[ 0 ];
2. 拼接路径名
NSString *filepath=[cachePaths tringByAppendingString: @"contents.txt" ];
3. 归档
[NSKeyedArchiver archiveRootObject:
self
.contents toFile:filepath];