IOS四种保存数据方式

首先每一个iOS应用都有⾃己的应⽤沙盒(应用沙盒就是文件系统目录),与其余文件系统隔离。应⽤必须待在⾃己的沙盒里,其余应用不能访问该沙盒。web

Documents: 保存应⽤运行时生成的须要持久化的数据 存储跟用户相关的文件, 用户的一些文本信息, 最好不要存储空间占用比较大的文件好比视频/音频等等.iTunes同步设备时会备份改目录。
经常使用拼接路径方法:sql

//1第一种
    NSString *path=NSHomeDirectory();
    NSString *filepath=[path stringByAppendingPathComponent:@"user.plist"];
    
    //2第二种
    NSArray *array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path=[array objectAtIndex:0];
    NSString *filepath=[path stringByAppendingPathComponent:@"user.plist"];

library: 给开发者使用的 用来存储一些东西的文件夹缓存

library//caches: 缓存文件夹, 用户看过的一些图片, 音频, 视频, 均可以存储在这个文件夹中, 通常清空缓存就是清除这个文件夹的全部内容,iTunes不会被分该目录。
library//preferences: 给开发者存储一些内容,NSUserDefaults保存的信息都在这个文件夹中,通常保存用户的偏好设置,iTunes会被分该目录。网络

temp: 临时文件夹, 存储网络请求过程当中的一些临时文件 app版本更新的时候, 会直接清空tmp文件夹。应用没有运行时,系统也可能会清除该目录下的文件,iTunes不会备份改目录。app

第一种:NSKeydeArchiversvg

用NSKeydeArchiver能够对模型对象进行归档,固然对象须要遵照NSCoding协议。
自定义对象进行归档处理,对象的属性要求:为基本数据类型(int或float)或者属性为实现了NSCoding协议类的实例。测试

#import "User.h"

@implementation User

-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInt:self.age forKey:@"age"];
    [aCoder encodeBool:self.sex forKey:@"sex"];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntForKey:@"age"];
        self.sex = [aDecoder decodeBoolForKey:@"sex"];
        
    }
    return self;
}
@end

归档:atom

User *user=[[User alloc]init];
    user.name=@"jsc";
    user.age=25;
    user.sex=YES;
    
    
    NSArray *array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path=[array objectAtIndex:0];
    NSString *filepath=[path stringByAppendingPathComponent:@"user.plist"];
    
    BOOL result = [NSKeyedArchiver archiveRootObject:user toFile:filepath];
    NSLog(@"%d", result);

解档:3d

NSArray *array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path=[array objectAtIndex:0];
    NSString *filepath=[path stringByAppendingPathComponent:@"user.plist"];
    
    User *user=[NSKeyedUnarchiver unarchiveObjectWithFile:filepath];
    NSLog(@"user.name--%@,user.age---%d,user.sex---%d",user.name,user.age,user.sex);

若是咱们使用模拟器,还能够找到这个应用,而后查看是否操做成功:code

首先,打开终端输入:open ~/Library/

而后按照:~/Library/Developer/CoreSimulator/Devices/<模拟器设备id>/data/Containers/Containers/Data/Application/<应用id>/Documents
模拟器设备id:XCode - Windows - Devices - 选取模拟器 - Device Information - Identifier中找到。
应用id:这个比较难找一点,反正我是一个一个去翻的。。。。。。。

而后根据应用id咱们找到这个应用的沙盒查看:

这里写图片描述

这里写图片描述

ok,最后测试了一下修改user属性问题,若是咱们的user.name改成jy了,那么咱们归档时依然须要对age和sex属性复制一块儿归档,不然,新的user.plist里面只会有一个name属性。其实也就是Documents里面不会重复建立user.plist,在咱们更改user的属性再次归档时,Documents会先删除以前的user.plist,而后再从新建立。

第一种:NSUserDefaults

这个就简单多了,不能存对象,并且此方法只会存入library/preferences中,通常咱们用来存放用户的偏好设置。

NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
//保存
    [defaults setObject:@"name" forKey:@"jsc"];
    [defaults setObject:@"name" forKey:@"jsc"];
    [defaults setObject:@"name" forKey:@"jsc"];
//及时同步
     [defaults synchronize];
     
//读取
    NSString *name= [defaults objectForKey:@"name"];
    NSString *age=[defaults objectForKey:@"age"];
    NSString *sex=[defaults objectForKey:@"sex"];

固然,不能存法对象,就只能单独一个一个的存属性了,那么这样的话若是咱们只更新user的name为jy的话,直接[defaults setObject:@“name” forKey:@“jy”]而后 [defaults synchronize]就能够了。

第三种:plist存储
//存放:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plistdemo" ofType:@"plist"];  
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];  
    NSLog(@"%@", data);  
      
    //添加一项内容  
    [data setObject:@"add some content" forKey:@"c_key"];  
      
    //获取应用程序沙盒的Documents目录  
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);  
    NSString *plistPath1 = [paths objectAtIndex:0];  
      
    //获得完整的文件名  
    NSString *filename=[plistPath1 stringByAppendingPathComponent:@"test.plist"];  
   //输入写入  
    [data writeToFile:filename atomically:YES];  
      
    //那怎么证实个人数据写入了呢?读出来看看  
    NSMutableDictionary *data1 = [[NSMutableDictionary alloc] initWithContentsOfFile:filename];  
    NSLog(@"%@", data1);

//读取

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:filename];  
    NSLog(@"%@", data);//直接打印数据。

第四种:sqlite 这个通常是用作网络数据的存放,网上搜一下 FMDB的使用。我就不写了,由于这个写起来耗时一些,有空时我专门作一个sqlite的demo演示发出来。