• 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;
    }
    
  • 相关阅读:
    java中如何使正在运行中的线程退出
    Java如何等待子线程执行结束
    java解析xml几种方式
    【Flask】配置参数
    【Flask】Session
    【Flask】jinja2
    【Flask】Request
    【Flask】Respones
    【Flask】路由系统
    【Flask】认识Flask
  • 原文地址:https://www.cnblogs.com/sublimter/p/4162764.html
Copyright © 2020-2023  润新知