关于数据存储(一)
主要知识为下面5点:
1,plist文件:主要是用来存储array数据和dictionary数据
特性:只能够存储NSArray,NSDictionary,NSNumber,NSData,NSDate,NSString,BOOL七种数据类型的数据
2,设置存储:主要是用来存储小数据,最好是单个的小数据,主要使用在设置中
3,序列化(对象序列化/对象持久化):就是将一个对象转化二进制
步骤:如果对象存储,必须要序列化,获取必须要反序列化(已完整的对象序列化包括对象序列化和反序列化,在NSCoding协议里面都有)
4,sqlite
5,coreData
本次先实现前3个内容和沙盒知识的补充
1.plist文件
NSArray *array = @[@"123",@"456",@"789"];
NSString *filePath = @"/Users/wangbing/Desktop/myPlist.plist";
//atomically:YES,考虑线程安全,影响性能。NO,不考虑线程安全,对性能没有影响
//将数据写到对应的路径中,其中路径必须为绝对路径
//如果多次存储数据,并不重新创建文件,而是更新文件的内容
[array writeToFile:filePath atomically:YES];
2,设置存储
这里 //创建一个userDefaults对象
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//获取Bool变量,setting是bool变量对应的标识符。如果没有,默认值NO
BOOL b = [userDefaults boolForKey:@"setting"];
if (!b) {
//将数据存储到某个位置,setting是设置存储标识,如果取值的话,就是通过标识符来取值的
//是固态存储,存储在硬盘当中,只要硬盘没坏,值一直存在
//通过setting来识别,如果有的话,直接修改对应的值,如果没有的话,直接创建并保存
[userDefaults setBool:YES forKey:@"setting"];
//设置同步存储,默认是异步存储
[userDefaults synchronize];
}else{
NSLog(@"有值");
}
//移除和setting对应的值
[userDefaults removeObjectForKey:@"setting"];写代码片
3,序列化(对象序列化/对象持久化)和反序列化:
自定义对象是不能直接存入内存和文件中的,必须经过序列化才能存储
<1>要存的对象遵守NSCoding协议
<2>在要存的对象.m文件中实现下面两个方法
// 序列化
- (void)encodeWithCoder:(NSCoder *)aCoder{
//将对象和其属性序列化,将对象和对象属性转化为二进制(name是对象的属性)
[aCoder encodeObject:self.name forKey:@"name"];
}
// 反序列化
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if (self) {
//将对象和其属性反序列化,将二进制数据转化为对象和属性
self.name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
<3>具体的操作
People *p = [[People alloc] init];
//会触发对象序列化方法
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:p];
//把序列化后的对象存入数组
NSArray *array = @[@"123",@"456",@"789",data];
//把数组存入plist文件中 ,@"/Users/wangbing/Desktop/myPlist.plist";是自己设定文件存储的绝对路径
NSString *filePath = @"/Users/wangbing/Desktop/myPlist.plist";
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath]) {
NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
//获取序列化的内容
NSData *data = [arr lastObject];
NSLog(@"data = %@",data);
//对象反序列化
id idValue = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"idValue = %@",idValue);
沙盒知识的补充:
沙盒:用来管理手机文件路径的工具叫做沙盒
作用:ios中绝大部分的数据保存路径都是在沙盒中(属于固态存储)
特性:从ios8之后,沙盒路径不再是一个静态不变的路径而是一个动态分配的路径
把数据存入沙盒 的2中方法
<1>
//把数据存入沙盒
//1,找到沙盒路径
NSArray *pathesArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//2,创建一个绝对路径
NSString *path = [pathesArray firstObject];
NSString *filePath = [path stringByAppendingPathComponent:@"Array.plist"];
NSArray *array = @[@"123",@"456",@"789"];
//atomically:YES,考虑线程安全,影响性能。NO,不考虑线程安全,对性能没有影响
//将数据写到对应的路径中,其中路径必须为绝对路径
[array writeToFile:filePath atomically:YES];
NSLog(@"%@",filePath);
<2>
//是苹果系统中,用来管理一切沙盒的管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *urlsArray = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSURL *url = [urlsArray firstObject];
//将url地址,转化为path路径
NSString *path = [url path];
//拼接绝对路径
NSString *filePath = [path stringByAppendingPathComponent:@"tmp.plist"];
NSLog(@"filePath = %@",filePath);
//判断是否存在filePath路径,如果存在,删除掉
if ([fileManager fileExistsAtPath:filePath]) {
// [fileManager removeItemAtPath:filePath error:nil];
}
//将绝对路径转化为绝对URL地址
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
NSArray *array = @[@"123",@{@"key":@"value"},@"456",@"789"];
//atomically:YES,考虑线程安全,影响性能。NO,不考虑线程安全,对性能没有影响
//将数据写到对应的路径中,其中路径必须为绝对路径
if ([array writeToURL:fileUrl atomically:YES]) {
NSLog(@"存储成功");
}