1. 数据存储介绍
通常程序在运行过程中,或者程序结束之后,需要保存一些信息,而且需要持久化存储信息;比如登陆信息、视频播放记录、收藏记录等等;我们可以采用以下几种方式对数据进行持久化保存.
a.文件
b.plist
c.归档
d.NSUserDefaults
e.数据库
接下来只介绍Plist和归档这两种方式。
2. 属性列表文件 Plist(Property List)
(1)什么是plist文件, plist文件的作用
a. plist文件: property list 属性列表文件,文件的内容只能是 NSString NSNumber NSDate NSData NSArray NSDictionary类的对象内容,不能保存其他类型数据。
b. 作用: 对一些登陆注册信息 或者程序的配置信息(小数据)进行持久化存储。
(2)如何创建plist文件, 如何编辑plist文件
Plist文件内容的格式是XML语法格式;
a. 用代码创建 Plist 文件
如果要把 NSString NSNumber NSDate NSData NSArray NSDictionary 的对象写入文件,一般就用plist文件;
我们需要先将这些数据保存到一个数组或者字典中,然后调用数组和字典的相关函数, 把数组NSArray或者字典NSDictionary,写入plist文件;
//NSArray和NSDictionary写文件方法 - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
(3)如何在程序中读取plist文件数据
Plist文件的根节点(数据的最外层)通常是数组或者字典;
1.如果Plist文件的根节点是字典,
那么使用字典的类方法
+ (id)dictionaryWithContentsOfFile: (NSString *)path;
来读取Plist文件;
2.如果根节点是数组,
那么使用数组的类方法
+ (id)arrayWithContentsOfFile: (NSString *)path;
来读取Plist文件;
注: 上述两个方法只能读取Plist文件,不能读取其他格式的文件。
3. 文件归档
(1)什么是归档和解档
a. 归档(也称对象序列化,对象持久化存储)就是用某种打包格式将对象保存到本地的文件,以便以后读回该对象的内容
b. 解档(也称归档/读档)就是把归档的对象文件,读成原来的对象的过程。
-》 如何归档和解档
a. 系统类的归档和解档
// 序列化 数组归档 NSArray *array = @[@"xiaohong",@"iOS",@123]; NSString *path = @"/Users/sub/Desktop/data.archive"; //归档过程 BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:path]; if (success){ NSLog(@"归档成功"); }else{ NSLog(@"归档失败"); } // 反序列化 解档 NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"%@", newArray);
注: NSDictionary也可以直接进行归档和解档 ;归档的对象包括这个对象中的属性,它们所属类的都必须要遵守NSCoding归档协议才能归档和解档;
b. 自定义类的归档和解档
如果自定义的类对象要进行归档,那么这个对象的属性所属的类也必须要遵守归档协议NSCoding,必须实现以下两个方法:
//归档的时候调用的方法 - (void)encodeWithCoder:(NSCoder *)aCoder; //解档的时候要调用的方法 - (id)initWithCoder:(NSCoder *)aDecoder;
eg.示例部分代码
#import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { #if 0 //系统类型的归档和解档操作 NSDictionary* aDic = [[NSDictionary alloc]initWithObjectsAndKeys:@"hello",@"one",@"haha",@"two", nil]; NSString* path = @"/Users/sub/Desktop/aDic.archive"; //系统类的对象归档 [NSKeyedArchiver archiveRootObject:aDic toFile:path]; NSDictionary* bDic = [NSKeyedUnarchiver unarchiveObrunjectWithFile:path]; NSLog(@"bDic:%@",bDic); NSLog(@"aDic:%@",aDic); #endif Student* aStu = [[Student alloc] init]; NSLog(@"aStu:%@",aStu); NSString* path = @"/Users/sub/Desktop/aStu.archive"; [NSKeyedArchiver archiveRootObject:aStu toFile:path]; Student* bStu = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"bStu:%@",bStu); } return 0; }
4. Json 存储
(1)什么是JSON
JSON是一种轻量级的数据交换格式,JSON语法是 JavaScript 语法的子集;
JSON 数据的书写格式是:名称:值 构成键值对。(类似于OC字典的键值对)
(2)JSON的基本语法
名称/值对 包括字段名称(在双引号中),后面写一个冒号,然后是值。如 "firstName":"tom"
JSON的值可以是:
a. 数字 (整数或浮点数)
b. 字符串 (在双引号中)
c. 逻辑值 (true 或 false)
d. 数组 (在方括号中)
e. 对象 (在花括号中)
f. null
(3)JSON结构
JSON有数组和字典两种结构;通过这两种结构可以表示各种复杂的结构;
a. 数组:
数组在js中是中括号“[]”括起来的内容,数据结构为 [“Js”, "javascript", "vb”,“vc”,…],类似于OC中的数组.
b. 对象:
对象在js中表示为“{}”括起来的内容,数据结构为 {key:value, key:value, ...}的键值对的结构,类似于OC中的字典;
(4)JSON解析
假如本地有一文件内容的格式是JSON格式。
a. 首先调用
+ (id)stringWithContentsOfFile:(NSString *)path
encoding:(NSStringEncoding)enc
error:(NSError **)error;把文件读成字符串.
b. 然后把字符串转化为NSData 二进制数据;
c. 调用 系统类NSJSONSerialization的
+ (id)JSONObjectWithData:(NSData *)data
options:(NSJSONReadingOptions)opt
error:(NSError **)error;
进行解析,最后解析为NSArray 或者NSDictionary
注:
JSON数据的最外层通常是字典或者数组,字典结构居多。使用NSJSONSerialization来解析json 数据,解析出来是OC中的NSArray 或者NSDictionary。
eg.示例代码
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //第一步:读取 json 格式文件,变成字符串 NSString* json_des = [NSString stringWithContentsOfFile:@"/Users/sub/Desktop/jiexi_json.txt" encoding:NSUTF8StringEncoding error:nil]; //第二步:将上述字符串,转成 NSData对象 NSData* aData = [json_des dataUsingEncoding:NSUTF8StringEncoding]; //第三步:将 NSData 对象,提交给 JSON 解析器解析 NSDictionary* json_dic = [NSJSONSerialization JSONObjectWithData:aData options:NSJSONReadingMutableContainers error:nil]; //使用 for-in 循环结构,遍历打印字典 for ( NSString* key in json_dic){ NSLog(@"Key:%@ -> Value:%@ ",key,[json_dic objectForKey:key ]); } } return 0; }