OC语言--数据存储(归档&plist&Json)

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;
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。