文档章节

iOS数据持久化——数据归档

kinglin_fu
 kinglin_fu
发布于 2016/01/29 17:07
字数 877
阅读 129
收藏 3

##1、数据归档(Archive)

使用属性列表可以持久化数据,但是这种保存的方式是明文的不能达到文件的隐秘性。iOS中还提供了一种持久化的方法叫做数据归档,使用 NSKeyedArchiver (归档) 和 NSKeyedUnarchiver (解归档)类完成。这种方式可以对数据进行编码为二进制的形式保存,从而达到数据的隐秘性。要归档的数据必须实现**<NSCoding>协议,<NSCoding>协议包含encodeWithCoder:**编码方法 和 **initWithCoder:**解码方法。

  • ###1.1 常用Foundation类的数据归档 常用的Foundation类都实现了<NSCoding>协议,所有可以直接归档,包含可变类型。归档的过程就是将数据进行编码保存,使用 NSKeyedArchiver 进行编码归档。
	//1、创建文件保存路径
   NSString *dicPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
   NSString *filePath = [dicPath stringByAppendingPathComponent:@"data.archive"];
   
   //2、设置保存的数据
   NSMutableArray *infos = [NSMutableArray array];
   [infos addObject:@"One"];
   [infos addObject:@100];
   [infos addObject:[NSDate date]];
   
   //3、将数据归档到指定路径
   [NSKeyedArchiver archiveRootObject:infos toFile:filePath];

输入图片说明

  • ###1.2 常用Foundation类的数据解归档 解档就是将编码的数据进行反编码为原来的类型数据,使用 NSKeyedUnarchiver 完成解档。
	NSMutableArray *objs = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@",objs);
  • ###1.3自定义的对象归档 有时候我们需要本地保存自己定义的一些对象数据,这些对象并没有实现<NSCoding>协议,所以在归档数据前要先去实现<NSCoding>协议中的方法,在协议方法中对自定义对象属性的编码和解码。如下实现自定义的User类对象的归档:
	1、.h中设置属性并实现<NSCoding>协议
	
	@interface User : NSObject <NSCoding> 
	
	@property(assign, nonatomic) NSInteger userID;
	@property(copy, nonatomic) NSString *userName;
	@property(copy, nonatomic) NSString *userPassword;

	@end
	2、.m文件中实现协议方法,encodeWithCoder: 和 initWithCoder:完成对属性数据的编码和解码。
	
	// 给数据编码
	- (void)encodeWithCoder:(NSCoder *)aCoder
	{
    	[aCoder encodeInteger:_userID forKey:@"userID"];
    	[aCoder encodeObject:_userName forKey:@"userName"];
		[aCoder encodeObject:_userPassword forKey:@"userPassword"];
	}

	// 给数据解码
	- (instancetype)initWithCoder:(NSCoder *)aDecoder
	{
		if (self = [super init]) {
        
			self.userID = [[aDecoder decodeObjectForKey:@"userID"] integerValue];
        	self.userName = [aDecoder decodeObjectForKey:@"userName"];
        	self.userPassword = [aDecoder decodeObjectForKey:@"userPassword"];
		}
   		return self;
	}
	3、将自定义对象归档到指定文件路径中
	
	// 设置路径
    NSString *dicPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [dicPath stringByAppendingPathComponent:@"user"];
    
    // 创建对象设置数据
    User *user = [[User alloc] init];
    user.userID = 1000001;
    user.userName = @"kingde";
    user.userPassword = @"123456789";
    
    // 归档自定义对象,归档会调用encodeWithCoder:方法
    [NSKeyedArchiver archiveRootObject:user toFile:filePath];
  • ###1.4 自定义的对象解归档
	// 解档
    User *userData = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"user:%@",userData);
  • ###1.5 将数据转为NSData归档

归档数据时可以直接将该类型数据归档,也可以将这些类型的数据编码为NSData类型的数据后再进行持久保存(NSData保存的是二进制的数据)。

NSKeyedArchiver的**archivedDataWithRootObject:**:方法将对象数据编码为NSData类型数据。

NSKeyedUnarchiver的**unarchiveObjectWithData:**:方法将NSData类型数据解码为原类型数据。


	 NSString *dicPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [dicPath stringByAppendingPathComponent:@"object"];
    
    User *user = [[User alloc] init];
    user.userID = 1000002;
    user.userName = @"kitty";
    user.userPassword = @"98754321";
    
    // 1、使用NSKeyedArchiver将自定义的对象数据编码为NSData对象
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];
    
    // 2、写入数据到指定路径中
    [data writeToFile:filePath atomically:YES];
    
    // 3、获取保存的NSData数据
    NSData *objData = [NSData dataWithContentsOfFile:filePath];
    
    // 4、将NSData数据解码为自定义的对象
    User *userObj = [NSKeyedUnarchiver unarchiveObjectWithData:objData];
    
    NSLog(@"%@",userObj);

© 著作权归作者所有

kinglin_fu
粉丝 16
博文 11
码字总数 14320
作品 0
石景山
私信 提问
浅谈iOS开发中的对象归档

iOS提供的数据持久化方式有:SQLiteCoreData属性列表、NSUserDefault对象归档。 这里来简单介绍下iOS开发中的对象归档: 对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化...

泊菜
2014/11/27
3.9K
8
iOS应用存储数据的常用的方式之plist和归档

iOS应用创建的数据存储方式 plist文件,是XML属性的列表形式 归档(遵循协议) SQLite(需要自己写sql语句) Core Data 苹果对的一个封装 今天我们先来说说文件,需要知道一个概念 沙盒文件 每一个...

追逐iOS
04/20
0
0
如果只有一个月的时间学 iOS 开发,我们该做些什么?

一年前,我还是一个 Android 开发者。那时候我没有任何 iOS 编程相关的知识,我甚至没用过任何苹果的产品。然而,这已成为过去,现在我已经能同时开发 iOS 和 Android 应用了。 现在,我想给...

oschina
2017/03/09
3.3K
13
iOS应用数据存取之数据库存储-----Core Data

iOS应用数据存取的常用方式有如下几种XML属性列表 —— PListNSKeyedArchiver 归档Preference(偏好设置)SQLite3Core Data 现在我想记录以下我对core Data的认识存在理由:苹果公司为了关照...

哥特复心
2014/01/08
0
2
OSC 第 76 期高手问答 — iOS 性能优化&数据持久化

OSCHINA 本期高手问答 ( 5月27日- 6月2日) 我们请来了@智捷课堂(关东升)为大家解答关于 iOS 性能优化和数据持久化 方面的问题。 关东升,智捷课堂创始人,国内知名 iOS 技术作家,iOS 技术...

叶秀兰
2015/05/27
4.1K
28

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins基础入门-5-用户和权限管理

本篇,我们来介绍下Jenkins上如何创建用户,以及如何管理用户,和那些用户可以有ProjectA的权限。这个很好理解,一个项目,有开发和测试,和运维,每个团队都有不同的角色,例如有测试经理和...

shzwork
25分钟前
1
0
linux上解压版安装jdk,tomcat

需要的安装包 1.vmware12 2.centos7版本 3.安装完成后需要xshell来连接远程虚拟机,虚拟机保证要联网,网络畅通。 4.xftp用来向linux传输文件用,一般来说xshell和xftp配套使用 5.对应的压缩...

architect刘源源
今天
26
0
使用 spring 的 IOC 解决程序耦合

工厂模式解耦 在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时...

骚年锦时
今天
2
0
group by分组后获得每组中时间最大的那条记录

用途: GROUP BY 语句用于 对一个或多个列对结果集进行分组。 例子: 原表: 现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。 我们使用下列 SQL 语句: SELECT ID,US...

豆花饭烧土豆
今天
3
0
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

本文将基于android6.0的源码,对Camera API2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之Camera API2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进...

天王盖地虎626
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部