持久化技术

(Persistent): 内存数据存储到磁盘(内存/变量存储到沙盒的某个文件中)实现将程序产生的数据保存,下次再次打开存储数据仍能访问这些保存下来的数据,例如:记住登陆名和密码,消息记录

—> 五种选择方案 —>

 

 

一. NSUserDefaults

是什么?

系统提供的一个类, 将内存的数据存储沙盒中; 在任何时候将存储的数据取出

支持基本数据类型: NSString; NSNumber; NSDate; NSArray;NSDictionary…

怎么用? (单例 + 选方法 + 存/读)

a. 获取NSUserDefaults单例对象

,选择方法,存储

,选择方法,读取

使用NSUserDefaults存数据系统自动创建成Plist文件

适用场景

1. 不适用大数据量的存储 (key)

原因: 内存中的数据存入磁盘 (IO操作)

2. 少量的数据

样例: 使用NSUserDefaults来存储数据和读取数据到沙盒中的文件

1.获取NSUserDefaults单例对象

    NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];

2.写入数据 


//用单例对象选择不同方法存储数据(自动地创建一个文件;???)
setBool:YES forKey:@"logIn"];
setInteger:1 forKey:@"count"];
NSArray *array = @[@"Maggie", @"Jonny"];
setObject:array forKey:@"userArray"];
 //.强制调用写入的方法(不会马上将数据写入文件中)
synchronize];//同步

3.读取数据 



boolForKey:@"logIn"], 
integerForKey:@"count"], 
arrayForKey:@"userArray"]

4.使用单例对象移除数据(不会删除文件)

[defaults removeObjectForKey:@"logIn"];
 [defaults removeObjectForKey:@"count"];
removeObjectForKey:@"userArray"];


二、Plist文件



首先手动创建一个PList文件



//1.获取手动创建的plist文件的路径
      NSString  *l=[[NSBundle  mainBundle]bundlePath];//应用沙盒路径
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"student" ofType:@"plist"];
    //2.根据plist文件Root的type类型,使用不同的类型来接收数据(NSArray/NSDictionary)
NSArray *plistArray = [[NSArray alloc] initWithContentsOfFile:plistPath];


从plist文件中读取数据,确定plist文件Root的类型type

    NSDictionary *dic = [[NSDictionary alloc] initWithContentsOfFile:self.testPath];

三、NSKeyedArchiver(归档、解档)

支持数据类型: 

1. 只要遵循了NSCoding协议的类, 都可以使用归档方式存数数据

    一般基本的数据类型都已经遵循的NSCoding协议


2. 支持自定义的类型 Person.h/.m: NSObject

归档Archiving

归档Archiving (写)

归档(写)步骤

1. 准备一个可存储数据的可变数据类型NSMutableData

2. 创建一个NSKeyedArchiver对象

3. 对要保存的数据进行编码操作(二进制格式)

4. 执行完成编码操作

5. 将编码后的数据写入文件

//需求:将两个NSArray对象使用归档方式存到文件
      //准备两个数据对象
    NSArray *firstArray = @[@"Jonny", @19, @[@"Objective-C", @"Ruby"]];
NSArray *secondArray = @[@"Bob", @"Maggie"];
      //1.准备一个可变的数据对象(空的)
    NSMutableData *data = [NSMutableData data];
NSLog(@"编码前的数据长度:%lu", (unsigned long)data.length);
    //2.创建NSKeyedArchiver对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
      //3.对数据进行编码操作(二进制)
encodeObject:firstArray forKey:@"firstUser"];
encodeObject:secondArray forKey:@"secondUser"];
    //4.执行完成编码
finishEncoding];
NSLog(@"编码后的数据长度:%lu", (unsigned long)data.length);
      //5.将完成编码的数据写入文件
    if([data writeToFile:self.archivingFilePath atomically:YES]) {
NSLog(@"写入成功");
     }

解档/反归档Unarchiving (读)

1. 从归档文件中读取二进制数据

2. 创建一个NSKeyedUnarchiver对象

3. 对数据进行解码

4. 执行完成解码操作

//需求:从写入的文件中读取数据,验证
    //1.从文件中读取数据(二进制NSData)
    NSData *data = [NSData dataWithContentsOfFile:self.archivingFilePath];
    //2.创建一个NSKeyedUnarchiver对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    //3.对数据进行解码操作(key)
NSArray *firstArray = [unarchiver decodeObjectForKey:@"firstUser"];
NSArray *secondArray = [unarchiver decodeObjectForKey:@"secondUser"];
    //4.执行完成解码操作
finishDecoding];
    //打印验证
NSLog(@"firstArray:%@", firstArray);
NSLog(@"secondArray:%@", secondArray);