数据持久化技术(一)

数据持久化技术

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值