iOS 数据持久化方式 - 归档 反归档
来源:互联网 发布:linux查看ip配置 编辑:程序博客网 时间:2024/05/18 01:30
- 所谓归档:将复杂对象转化为NSData类型数据(复杂-->归档-->NSData--->WriteToFile)
注意:归档是将对象转化为数据字节,以文件的形式存储在磁盘上, 所谓反归档:将NSData类型数据转化为复杂对象(读取文件-->NSData-->反归档--->复杂对象)
再说归档之前,先说下iOS的数据持久化方式:
那么问题来了,什么是数据持久化?数据持久化(侠义的理解):仅仅指把域对象永久保存到数据库中,(广义的理解):包括和数据库相关的各种操作
优点:
1:数据持久化可以减少访问数据库数据的次数,增加应用程序执行的速度;
2:代码重用性高,能够完成大部分数据库操作;
3:低耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需要修改配置文件而不用修改代码
那么iOS的数据化持久方式有哪些呢?
1:属性列表(Plist文件),NSUserDefault
2:归档(NSKeyedArchiver)
3:数据库(SQlite,CoreData,FMDB(第三方))
今天重点说下归档和结档的问题
归档的三种方式:
1:对foundation框架的对象进行归档
2:对自定义的对象进行归档
3:对自定义内容进行归档
注意:归档生成的文件是加密的
下边举简单的例子分别说下归档的三种方式
#pragma mark---对自定义对象进行归档反归档----- (void)archive{//先创建一个Person类/* 第一:复杂对象所属的类一定要遵循NSCoding协议 第二:实现协议中的方法 - (void)encodeWithCoder:(NSCoder *)aCoder; - (instancetype)initWithCoder:(NSCoder *)aDecoder;//归档(由叫序列化)的步骤//对Person类对象进行归档时执行此方法.并对Person类中想要进行归档的所有属性,进行序列化操作- (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeObject:_gender forKey:@"gender"]; [aCoder encodeObject:_age forKey:@"age"];}//反归档(由叫反序列化)的步骤//对Person类对象进行反归档时执行此方法.并对Person类中想要进行反归档的所有属性,进行反序列化操作- (instancetype)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { _name = [aDecoder decodeObjectForKey:@"name"]; _gender = [aDecoder decodeObjectForKey:@"gender"]; _age = [aDecoder decodeObjectForKey:@"age"]; } return self;} */ person *per = [person new]; per.name = @"甲甲"; per.age = @"20"; per.gender = @"女"; //归档 //1:准备路径 NSString *path = NSHomeDirectory(); path = [path stringByAppendingString:@"Singel.plist"]; //2:准备存储数据对象(用可变数组进行接收) NSMutableData *data = [NSMutableData new]; //3:创建归档对象 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; //4:开始归档 [archiver encodeObject:per forKey:@"person"]; //5:完成归档 [archiver finishEncoding]; //6:写入文件 BOOL result = [data writeToFile:path atomically:YES]; if (result) { NSLog(@"归档成功:%@",path); } //反归档 //1:获取解档路径 NSData *MyData = [NSData dataWithContentsOfFile:path]; //2:创建反归档对象 NSKeyedUnarchiver *unarchiver= [[NSKeyedUnarchiver alloc]initForReadingWithData:MyData]; //3:反归档 person *aper = [person new]; aper = [unarchiver decodeObjectForKey:@"person"]; //4:结束归档 [unarchiver finishDecoding]; NSLog(@"%@",aper.name);}
#pragma mark----对foundation框架中的对象进行归档和反归档- (void)fundationClass{//归档 //1:创建路径 NSString *Doucuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]; NSString *path = [Doucuments stringByAppendingString:@"file.plist"]; //2:归档(不需要结束方法) NSArray *array = @[@"jiajia",@"jiejie",@"pangpang"]; BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:path]; if (result) { NSLog(@"框架中的归档%@",path); } //反归档 NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"框架的结档%@",newArray);}
#pragma mark----对自定义的内容进行归档和反归档- (void)customContent{//归档 //1:获取路径 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]; path = [path stringByAppendingString:@"custom.plist"]; NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; [archiver encodeObject:@"111" forKey:@"name"]; [archiver encodeObject:@"2" forKey:@"gender"]; [archiver encodeObject:@"100" forKey:@"age"]; [archiver finishEncoding]; BOOL result = [data writeToFile:path atomically:YES]; if (result) { NSLog(@"归档%@",path); } NSData *newdata = [NSData dataWithContentsOfFile:path]; NSKeyedUnarchiver *unkeyed = [[NSKeyedUnarchiver alloc]initForReadingWithData:newdata];// NSString *str1 = [unkeyed decodeObjectForKey:@"name"];// NSString *str2 = [unkeyed decodeObjectForKey:@"gender"];// NSString *str3 = [unkeyed decodeObjectForKey:@"age"]; person *pp = [person new]; pp.name = [unkeyed decodeObjectForKey:@"name"]; pp.gender = [unkeyed decodeObjectForKey:@"gender"]; pp.age = [unkeyed decodeObjectForKey:@"age"]; [unkeyed finishDecoding]; NSLog(@"name:%@ gender:%@ age:%@",pp.name,pp.gender,pp.age);// NSLog(@"name:%@ gender:%@ age:%@",str1,str2,str3);
}
文/钎探穗(简书作者)
原文链接:http://www.jianshu.com/p/df801df8169e
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/df801df8169e
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
0 0
- iOS 数据持久化方式 - 归档 反归档
- iOS 数据持久化(归档与反归档)
- iOS中的数据持久化,归档和反归档
- IOS之数据持久化(归档与反归档)
- iOS之数据持久化 - 归档与反归档
- 归档与反归档(ios数据持久化)
- iOS数据持久化,写入,归档和反归档
- 数据持久化,归档,反归档
- iOS 归档持久化数据
- iOS数据持久化 归档
- IOS数据持久化--归档
- iOS_初级数据持久化_归档与反归档
- IOS之数据持久化二(归档与反归档)
- iOS初级数据持久化 沙盒机制 归档与反归档
- iOS经典讲解之复杂对象的数据持久化-归档与反归档
- iOS开发-数据持久化 :沙盒,归档反归档,NSFileManager文件管理器(单例)
- IOS 数据持久化只归档与取消归档
- iOS归档、反归档
- 老曹骑士
- 线性表
- 剑指offer题解 连续子数组的最大和
- android开发之http协议
- JavaScript初了解
- iOS 数据持久化方式 - 归档 反归档
- Java异常处理和设计
- Spark,Hello World
- 框架 day65 Mybatis入门(基础知识:框架原理,入门[curd],开发dao层,全局与映射配置)
- 跟Google学写代码:Interacting with Other Apps【Capture Photo from phone】
- Objective-C中的布尔类型
- 二叉树的遍历
- 使用Hadoop提取网络日志KPI指标
- Javascript是单线程的深入分析