72-数据存储(数据持久化)

本文深入探讨了iOS应用的数据存储方式,包括XML属性列表(plist)、Preference、NSKeyedArchiver归档和SQLite3、CoreData等。同时介绍了应用沙盒的概念及其文件系统结构,以及如何使用plist和偏好设置进行数据存储。最后,展示了如何实现自定义对象的归档和解档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据存储(数据持久化)

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. 归档
[NSKeyedArchiver archiveRootObject: self .contents toFile:filepath];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值