Men的博客

欢迎光临!

0%

plist,归档和Json

数据持久化简介

文件: 最常用的最基础的存储数据的方式
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];