首页 > 代码库 > Object-c 数据存储知识大聚会

Object-c 数据存储知识大聚会

        通常程序在运行中或者程序结束之后,需要保存一些信息,而且需要持久化存储信息,比如登陆信息、视频播放记录、收藏记录等等,那么我们可以采用以下几种方式对数据进行持久化保存.

1.文件

2.plist 

3.归档

4.NSUserDefaults

5.数据库



【Plist】(文件的一种)

<1> 什么是plist文件, plist文件的作用

   1.plist文件:property list  属性列表文件,文件的内容只能是 NSString NSNumber NSDate NSData NSArray NSDictionary类的对象内容不能保存其他类型数据


2.作用:对一些登陆注册信息或者程序的配置信息(小数据)进行持久化存储


<2> 如何创建plist文件, 如何编辑plist文件

Plist文件内容的格式是XML语法格式

1.Xcode创建

1.点击File--》New File 弹出一对话框

2.iOS程序选中iOS栏中的Resource/Mac程序选中OS X 栏中的resource 

3.点击Resource中的Property List 创建plist文件

4.点击文件中的‘+‘可以添加数据


2.代码创建

如果要把 NSString NSNumber NSDate NSData NSArray NSDictionary 的对象写入文件一般就用plist文件  

我们需要这些数据保存到一个数组或者字典中,然后调用数组和字典的相关函数把数组NSArray或者字典NSDictionary写入plist文件

//NSArray和NSDictionary写文件方法

//YES是保证文件的写入原子性,就是说会先创建一个临时文件,直到文件内容写入成功再导入到目标文件里.NO是直接写入

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;


<3> 如何在程序中读取plist文件数据

Plist文件的根节点(数据的最外层)通常是数组或者字典,(字典居多)

如果Plist文件的根节点是字典那么使用字典的类方法+ (id)dictionaryWithContentsOfFile:(NSString *)path;读写Plist文件

如果根节点是数组那么使用数组的类方法+ (id)arrayWithContentsOfFile:(NSString *)path;读取Plist文件

注:上述两个方法只能读取Plist文件,不能读取其他格式的文件。


【归档】

<1>什么是归档和解档

1.归档(也称对象序列化)就是通过某种格式把对象保存到本地文件,以便以后读回该对象的内容


2.解档(也称读档)就是把归档的对象文件读成原来的对象的过程。

          <2>如何归档和解档

1.系统类的归档和解档

// 序列化 数组归档

       NSArray *array =@[@"xiaohong",@"iOS”,@“123”];

        

       NSString *path = @"/Users/apple/Desktop/data.archive";

       BOOL sucess = [NSKeyedArchiverarchiveRootObject:array toFile:path];

       if (sucess)

       {

           NSLog(@"归档成功");

              }else{

           NSLog(@"归档失败");

       }

       // 反序列化解档

       NSArray *newArray = [NSKeyedUnarchiverunarchiveObjectWithFile:path];

        NSLog(@"%@", newArray); 


注:1.NSDictionary也可以直接进行归档和解档 

2.归档的对象包括这个对象中的属性,它们所属类的都必须要遵守NSCoding 协议才能归档和解档


2.自定义类的归档和解档

如果自定义的类对象要进行归档那么这个对象的属性所属的类也必须要遵守归档协议NSCoding

必须实现以下两个方法:

//归档的时候调用的方法

- (void)encodeWithCoder:(NSCoder *)aCoder

{

[aCoderencodeInt:self.ageforKey:@”age“];

    [aCoder encodeObject:self.nameforKey:@“name”];

}

//解归档的时候要调用的函数

- (id)initWithCoder:(NSCoder *)aDecoder

{

   if (self = [superinit]) {//如果父类也遵守归档协议那么这里要调用 [super initWithCoder:];

        

            self.age = [aDecoderdecodeIntForKey:@“age”];

             self.name = [aDecoderdecodeObjectForKey:@“name”];

   }

 return self;

      }


归档时不一定要直接归档到文件,还可以先将他们归档成NSData,然后将NSdata进行存储,用的时候就用这个NSData解档

NSKeyedArchiver的类方法      + (NSData *)archivedDataWithRootObject:(id)rootObject;

NSKeyedUnarchiver的类方法 + (id)unarchiveObjectWithData:(NSData *)data;




【NSUserDefaults】是一个轻量级的负责本地存储的单例字典


NSArray *arr = [NSArrayarrayWithObjects:@"aa",@"bb",nil];

       //一个NSUserDefaults的单例对象(可变字典)

       NSUserDefaults *ud = [NSUserDefaultsstandardUserDefaults];

       //设置内容

        [udsetObject:arr forKey:@"a"];

       //同步

        [udsynchronize];

        

       //读取内容

       NSArray *aaa = [ud objectForKey:@"a"];




【JSON】

<1>.什么是JSON

JSON是一种轻量级的数据交换格式

JSON 数据的书写格式是:名称:值 构成键值对。类似于OC的字典中的键值对


<2>JSON的基本语法

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值。如 "firstName":"tom"

JSON的值可以是:

1.数字(整数或浮点数)

2.字符串(在双引号中)

3.逻辑值(true 或 false)

4.数组(在方括号中)

5.对象(在花括号中)

6.null


<3>JSON结构

JSON有数组和字典两种结构通过这两种结构可以表示各种复杂的结构

1.数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",…],类似于OC中的数组

2.对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,类似于OC中的字典结构



<4>JSON解析

假如本地有一文件内容格式是JSON格式。

1.首先调用+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;把文件读成字符串.

2.然后把字符串转化为NSData 二进制数据

3.调用  系统类NSJSONSerialization  + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;  方法进行解析,最后解析为NSArray 或者NSDictionary

      注:JSON数据的最外层通常是字典或者数组,字典结构居多。使用NSJSONSerialization解析json 数据,解析出来是OC中NSArray 或者NSDictionary