数据持久化简介
文件: 最常用的最基础的存储数据的方式
plist,xml,json 表示数据的某种格式
数据库: 海量的数据(省上所有人的电话信息)存储到数据库中
SQL Server 2000, mysql, Oracle
云端存储: 数据都存储的网络上, 安全性好, 跨设备,跨平台
plist文件
用途比较多
本质上来说是 Property List file, 属性列表文件
存储格式: 数据都是由字典,数组,字符串构成的
2.2 如何创建plist文件
File->OS X-Resource–> Proerty List
2.3 plist文件的读取和写入
//如何读取这个plist文件???
NSString *path = @”/Users/mac/Desktop/oc7-持久化存储/PlistUseDemo/PlistUseDemo/student.plist”;
//plist根结点只有两种类型, 数组和字典
// 分别使用NSArray和NSDictionary读取plist
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
//输出所有的班级的信息
//NSArray *classList = [dict valueForKey:@”classes”];
NSArray *classList = dict[@”classes”];
for (NSDictionary *classDict in classList) {
}
// 可以把一个数组或者字典写入到plist中
//参数1: 传入一个路径
//参数2: 表示是否安全的写入
[classList writeToFile:@”/Users/mac/Desktop/classList.plist” atomically:YES];
归档
使用归档, 可以直接把一个对象保存到文件中
//归档的使用
//作用: 对象保存到文件中
//相比plist: plist使用简单, 不能存储自定义对象
// 归档可以存储任意类型对象
NSArray *array = [[NSArray alloc] initWithObjects:@”小二”,@”三少”,@”四娘”,@”跳舞大神”, nil];
//通过归档的形式存储到文件中
//设置文件名
NSString *path = @”/Users/mac/Desktop/people.data”;
//NSKeyedArchiver专门用于归档的类
//参数1: 传入需要保存的对象
//参数2: 传入文件路径
BOOL b = [NSKeyedArchiver archiveRootObject:array toFile:path];
//把对象从文件中恢复出来===解档
//参数1: 传入保存了对象文件
//返回值: 返回保存的对象
// 类型原来存储的是什么类型, 用什么类型接收
NSArray *readArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
for(NSString *str in readArray)
{
}
自定义对象的归档和解档
//归档
NSString path = @”/Users/mac/Desktop/dog.data”;
//**** 自定义的对象不能直接归档, 会出现崩溃
//***** 需要告诉系统我们对象应该如何归档
// 自己类中添加一些指定的方法
[NSKeyedArchiver archiveRootObject:huaer toFile:path];
//解档刚才存入的对象
Dog *newDog = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@”–> %@ %@ %f %@”,
newDog.nickname,
newDog.gender,
newDog.weight,
newDog.type);
//告诉系统, 这个对象应该如何编码
// 如果没有加这个方法,自定义对象归档的时候会奔溃
- (void)encodeWithCoder:(NSCoder *)aCoder
{
//把类中的对象指定一个key, 编码到文件中
[aCoder encodeObject:self.nickname forKey:@”nickname”];
[aCoder encodeObject:self.gender forKey:@”gender”];
[aCoder encodeObject:[NSNumber numberWithFloat:self.weight] forKey:@”weight”];
[aCoder encodeObject:self.type forKey:@”type”];
}
//告诉系统, 这个对象应该如何解码
// 如果没有加这个方法,自定义对象解档的时候会奔溃
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
}//对数据进行解码操作 self.nickname = [aDecoder decodeObjectForKey:@"nickname"]; self.gender = [aDecoder decodeObjectForKey:@"gender"]; self.weight = [[aDecoder decodeObjectForKey:@"weight"] floatValue]; self.type = [aDecoder decodeObjectForKey:@"type"];
return self;
}
Json解析
Javascript Object Notation 简写
网络常用一种表示数据或交换数据的格式
4.2 Json数据格式
[]表示一个数组, 对应NSArray
{}表示一个字典, 对应NSDictionary
key:value 表示一个键值对
“str” 表示一个字符串 NSString
90 表示一个数字 NSNumber
, 表示并列的数据
4.3 Json格式的读取和使用
//如何解析JSON, 解析后如何获取其中数据
NSString *path = @”/Users/mac/Desktop/1422带课/oc7-持久化存储/topic.txt”;
//JSON先读取到程序中(NSString,NSData)
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
//OC提供专门用于JSON解析的类
//NSJSONSerialization
//功能: 把NSData类型JSON数据转化为字典或者数组
//参数1: 需要解析的JSON数据
//参数2: 传入一个选项
//参数3: 错误
//返回值: 如果JSON顶层结点是[],用NSArray接收
// 如果顶层结点是{}, 用NSDictionary接收
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];