持久化技术
(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);