IOS四种保存数据方式
2017-04-26 16:38
399 查看
首先每个iOS应用都有⾃己的应⽤沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应⽤必须待在⾃己的沙盒里,其他应用不能访问该沙盒。
Documents: 保存应⽤运行时生成的需要持久化的数据 存储跟用户相关的文件, 用户的一些文本信息, 最好不要存储空间占用比较大的文件比如视频/音频等等.iTunes同步设备时会备份改目录。
常用拼接路径方法:
library: 给开发者使用的 用来存储一些东西的文件夹
library//caches: 缓存文件夹, 用户看过的一些图片, 音频, 视频, 都可以存储在这个文件夹中, 一般清空缓存就是清除这个文件夹的所有内容,iTunes不会被分该目录。
library//preferences: 给开发者存储一些内容,NSUserDefaults保存的信息都在这个文件夹中,一般保存用户的偏好设置,iTunes会被分该目录。
temp: 临时文件夹, 存储网络请求过程中的一些临时文件 app版本更新的时候, 会直接清空tmp文件夹。应用没有运行时,系统也可能会清除该目录下的文件,iTunes不会备份改目录。
第一种:NSKeydeArchiver
用NSKeydeArchiver可以对模型对象进行归档,当然对象需要遵守NSCoding协议。
自定义对象进行归档处理,对象的属性要求:为基本数据类型(int或float)或者属性为实现了NSCoding协议类的实例。
归档:
解档:
如果我们使用模拟器,还可以找到这个应用,然后查看是否操作成功:
首先,打开终端输入:open ~/Library/
然后按照:~/Library/Developer/CoreSimulator/Devices/<模拟器设备id>/data/Containers/Containers/Data/Application/<应用id>/Documents
模拟器设备id:XCode - Windows - Devices - 选取模拟器 - Device Information - Identifier中找到。
应用id:这个比较难找一点,反正我是一个一个去翻的。。。。。。。
然后根据应用id我们找到这个应用的沙盒查看:
![](https://img-blog.csdn.net/20170426160836322?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjk4OTI5NDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170426160929542?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjk4OTI5NDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
ok,最后测试了一下修改user属性问题,如果我们的user.name改为jy了,那么我们归档时依然需要对age和sex属性复制一起归档,否则,新的user.plist里面只会有一个name属性。其实也就是Documents里面不会重复创建user.plist,在我们更改user的属性再次归档时,Documents会先删除之前的user.plist,然后再重新创建。
第一种:NSUserDefaults
这个就简单多了,不能存对象,而且此方法只会存入library/preferences中,一般我们用来存放用户的偏好设置。
当然,不能存法对象,就只能单独一个一个的存属性了,那么这样的话如果我们只更新user的name为jy的话,直接[defaults setObject:@”name” forKey:@”jy”]然后 [defaults synchronize]就可以了。
第三种:plist存储
//存放:
//读取
第四种:sqlite
这个一般是用做网络数据的存放,网上搜一下 FMDB的使用。我就不写了,因为这个写起来耗时一些,有空时我专门做一个sqlite的demo演示发出来。
Documents: 保存应⽤运行时生成的需要持久化的数据 存储跟用户相关的文件, 用户的一些文本信息, 最好不要存储空间占用比较大的文件比如视频/音频等等.iTunes同步设备时会备份改目录。
常用拼接路径方法:
//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不会备份改目录。
第一种:NSKeydeArchiver
用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
归档:
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);
解档:
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);
如果我们使用模拟器,还可以找到这个应用,然后查看是否操作成功:
首先,打开终端输入: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);
//读取
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plistdemo" ofType:@"plist"]; NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; NSLog(@"%@", data);//直接打印数据。
第四种:sqlite
这个一般是用做网络数据的存放,网上搜一下 FMDB的使用。我就不写了,因为这个写起来耗时一些,有空时我专门做一个sqlite的demo演示发出来。