数据持久化技术(一)

数据持久化技术 持久化(Persistent): 内存数据存储到磁盘(内存/变量存储到沙盒的某个文件中)实现将…

数据持久化技术

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

内存数据 —> 五种选择方案 —> 磁盘(沙盒某个文件)

一. NSUserDefaults

是什么?

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

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

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

a. 获取NSUserDefaults单例对象

b. 针对不同的数据类型,选择方法,存储

c. 针对不同的数据类型,选择方法,读取

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

适用场景

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

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

2. 少量的数据

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

1.获取NSUserDefaults单例对象

NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];

2.写入数据

//用单例对象选择不同方法存储数据(自动地创建一个文件;???)

[defaults setBool:YES forKey:@”logIn”];

[defaults setInteger:1 forKey:@”count”];

NSArray *array = @[@”Maggie”, @”Jonny”];

[defaults setObject:array forKey:@”userArray”];

//.强制调用写入的方法(不会马上将数据写入文件中)

[defaults synchronize];//同步

3.读取数据

[defaults boolForKey:@”logIn”],

[defaults integerForKey:@”count”],

[defaults arrayForKey:@”userArray”]

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

[defaults removeObjectForKey:@”logIn”];

[defaults removeObjectForKey:@”count”];

[defaultsremoveObjectForKey:@”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.对数据进行编码操作(二进制)

[archiver encodeObject:firstArray forKey:@”firstUser”];

[archiver encodeObject:secondArray forKey:@”secondUser”];

//4.执行完成编码

[archiver 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.执行完成解码操作

[unarchiver finishDecoding];

//打印验证

NSLog(@”firstArray:%@”, firstArray);

NSLog(@”secondArray:%@”, secondArray);

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/8194.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部