IOS开发--数据持久化篇文件存储(二)
本篇博客将介绍以下几个方面的内容
2)拥有继承关系的对象归档
3)同时将多个对象进行归档
1.自定义一个跟小明一样有名的类(Person)
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject<NSCoding> /**
* 姓名
*/
@property (nonatomic, strong) NSString *name ; /**
* 地址
*/
@property (nonatomic, strong) NSString *address ; /**
* 年龄
*/
@property (nonatomic, assign) int age; -(instancetype)initWithName:(NSString *)name address:(NSString *)address age:(int)age;//初始化方法 @end
Person.m
#import "Person.h"
@implementation Person
-(instancetype)initWithName:(NSString *)name address:(NSString *)address age:(int)age{
if (self = [super init]) {
self.name = name;
self.address = address;
self.age = age;
}
return self;
}
//告知编译器,我们需要归档当前对象的哪些属性
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.address forKey:@"address"];
[aCoder encodeInt: self.age forKey:@"age"];
}
//告知编译器,解档时对应的属性
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
self.name = [aDecoder decodeObjectForKey:@"name"];
self.address = [aDecoder decodeObjectForKey:@"address"];
self.age = [aDecoder decodeIntForKey:@"age"];
return self;
}
//重写description,方便调试查看对象属性信息
-(NSString *)description{
return [NSString stringWithFormat:@"name : %@, address : %@,age : %d",self.name,self.address,self.age];
}
@end
控制器代码1:归档
-(void)personArchive{
//创建及初始化对象
Person *p = [[Person alloc] initWithName: @"jack" address:@"Mars" age:];
//定义归档路径
NSString *fullPath = [self fullPathWithFileName:@"person.data"];
//进行归档
[NSKeyedArchiver archiveRootObject:p toFile:fullPath];
NSLog(@"对象归档成功");
}
控制器代码2:解档
-(void)personUnarchive{
//指定路径
NSString *fullPath = [self fullPathWithFileName:@"person.data"];
//解档操作
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:fullPath];
//打印结果
NSLog(@"%@",p);
}
注: fullPathWithFileName: 方法为便捷获取路径方法,代码如下
-(NSString *)fullPathWithFileName:(NSString *)fileName{
NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//拼接完整路径并返回
return [documentDir stringByAppendingPathComponent:fileName];
}
依次调用我们的归档和解档方法
[self personArchive];//归档
[self personUnarchive];//解档
结果如下:

至此我们已经实现了简单的单个对象的归档和解档操作,下面我们来看下继承关系下的对象的归档解档操作
定义一个Student类继承自Person类,代码如下
Student.h
#import "Person.h" @interface Student : Person /**
* 学校名称
*/
@property (nonatomic, strong) NSString *schoolName;
//快速初始化方法
-(instancetype)initWithName:(NSString *)name address:(NSString *)address age:(int)age schoolName:(NSString *)schoolName; @end
Student.m
#import "Student.h"
@implementation Student
-(instancetype)initWithName:(NSString *)name address:(NSString *)address age:(int)age schoolName:(NSString *)schoolName{
if (self = [super initWithName:name address:address age:age]) {
self.schoolName =schoolName;
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:self.schoolName forKey:@"schoolName"];
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
self.schoolName = [aDecoder decodeObjectForKey:@"schoolName"];
return self;
}
//重写description,方便调试查看属性信息
-(NSString *)description{
//先拿到父类拥有的属性描述
NSString *str = [super description];
//添加子类特有的描述,返回
return [str stringByAppendingString:[NSString stringWithFormat:@",schoolName : %@",self.schoolName]];
}
@end
控制器方法1:归档
-(void)studentArchive{
//声明一个子类对象
Student *stu = [[Student alloc] initWithName:@"小明" address:@"走廊" age: schoolName:@"剑桥大学"];
//定义路径
NSString *fullpath = [self fullPathWithFileName:@"stu.data"];
//归档操作
[NSKeyedArchiver archiveRootObject:stu toFile:fullpath];
NSLog(@"归档成功");
}
控制器方法2:解档
-(void)studentUnarchive{
NSString *fullpath = [self fullPathWithFileName:@"stu.data"];//指定路径
Student *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:fullpath];//解档
NSLog(@"%@",stu);//打印信息
}
依次调用上述两个方法,运行结果如下

演示代码如下:
1.归档
-(void)multipleArchive{
//创建并初始化两个对象
Student *s0 = [[Student alloc]initWithName:@"name0" address:@"address0" age: schoolName:@"schoolName0"];
Student *s1 = [[Student alloc]initWithName:@"name1" address:@"address1" age: schoolName:@"schoolName1"];
//创建一个NSMutableData对象
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];//关联
[archive encodeObject:s0 forKey:@"student0"];
[archive encodeObject:s1 forKey:@"student1"];
[archive finishEncoding];
//指定路径
NSString *fullpath = [self fullPathWithFileName:@"multiple.data"];
//到这一步数据已缓存到data中,将其写入文件
[data writeToFile:fullpath atomically:YES];
NSLog(@"多对象归档成功");
}
02.解档:
-(void)multipleUnArchive{
NSString *fullpath = [self fullPathWithFileName:@"multiple.data"];//指定路径
NSData *data = [NSData dataWithContentsOfFile:fullpath];//将数据解析成NSData对象
NSKeyedUnarchiver *unArchive = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];//关联
Student *stu0 = [unArchive decodeObjectForKey:@"student0"];
Student *stu1 = [unArchive decodeObjectForKey:@"student1"];
[unArchive finishDecoding];
NSLog(@"%@",stu0);
NSLog(@"%@",stu1);
}
运行结果如下图:

实现两个方法:
encodeWithCoder://指定需要归档的属性
initWithCoder://指定需要解档的属性
2.继承关系的对象归档注意:
eg:
[super encodeWithCoder:aCoder];
self = [super initWithCoder:aDecoder];
3.多对象归档依赖于:NSData对象
IOS开发--数据持久化篇文件存储(二)的更多相关文章
- IOS开发--数据持久化篇之文件存储(一)
前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...
- iOS开发——数据持久化Swift篇&通用文件存储
通用文件存储 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...
- iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储
使用Core Data进行数据持久化存储 一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...
- iOS开发——数据持久化Swift篇&(二)沙盒文件
沙盒文件 //******************** 5.2 文件操作 func use_FileOperations() { //1.获取程序的Home目录 let homeDirectory = ...
- iOS开发——数据持久化Swift篇&iCloud云存储
iCloud云存储 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super. ...
- iOS开发——数据持久化OC篇&plist文件增删改查操作
Plist文件增删查改 主要操作: 1.//获得plist路径 -(NSString*)getPlistPath: 2.//判断沙盒中名为plistname的文件是否存在 -(BOOL ...
- iOS开发——数据持久化&本地数据的存储(使用NSCoder将对象保存到.plist文件)
本地数据的存储(使用NSCoder将对象保存到.plist文件) 下面通过一个例子将联系人数据保存到沙盒的“documents”目录中.(联系人是一个数组集合,内部为自定义对象). 功能如下: ...
- iOS开发——数据持久化Swift篇&(三)SQLite3
SQLite3 使用 //******************** 5.3 SQLite3存储和读取数据 func use_SQLite3() { //声明一个Documents下的路径 var db ...
- iOS开发——数据持久化Swift篇&(一)NSUserDefault
NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...
随机推荐
- tornado中使用torndb,连接数过高的问题
问题背景 最近新的产品开发中,使用了到了Tornado和mysql数据库.但在基本框架完成之后,我在开发时候发现了一个很奇怪的现象,我在测试时,发现数据库返回不了结果,于是我在mysql中输入show ...
- HNOI2008越狱(快速幂)
快速幂水过,贴一下模版. ; var x,y,n,m:int64; function power(num,times:int64):int64; var temp:int64; begin then ...
- windows2003 IIS6网络负载平衡设置
问题 随着计算机技术的不断发展,单台计算机的性能和可靠性越来越高.但现实中还是有许多应用是单台计算机难以达到,例如: 1.银行存储用户数据的数据库服务器必须保证24小时不间断的运转,并在发生严重硬件故 ...
- Woobuntu woobuntu_build.sh hacking
# Woobuntu woobuntu_build.sh hacking # 说明: # 有时候因为一些需求,我们需要定制一些系统,包括Ubuntu系统,于是 # 我们自然需要知道如何去解包一个Ubu ...
- HDU 2444 The Accomodation of Students (偶图判定,匈牙利算法)
题意: 有一堆的学生关系,要将他们先分成两个组,同组的人都不互不认识,如果不能分2组,输出No.若能,则继续.在两组中挑两个认识的人(每组各1人)到一个双人房.输出需要多少个双人房? 思路: 先判定是 ...
- Delphi 2010
Delphi 2010已早由Embarcadero公司发布.作者Kim Madsen作为一名资深的Delphi开发者,在他的博客中谈到了Delphi 2010的新性能.它的使用感受以及对Delphi语 ...
- [Everyday Mathematics]20150114
设 $a_0$, $d$ 给定, $a_k=a_0+kd$, $k=0,1,\cdots,n$. 试求如下 $n+1$ 阶行列式的值: $$\bex \sev{\ba{ccccc} a_0&a ...
- QT-【转】基础(略)
第0篇 开始学习Qt 与Qt Creator 第1篇 基础(一)Qt开发环境的搭建和hello world 第2篇 基础(二)编写Qt多窗口程序 第3篇 基础(三)Qt登录对话框 第4篇 基础(四)添 ...
- 去除下载电影和电视剧文件名中的多余字符[python实现]
讨厌下载电影和电视剧文件名中的多余字符(如网址和广告字样),,搞得文件名好长,可以使用下面的Python代码,自行修改即可. #!\usr\bin\env python # -*- coding: u ...
- Polymer——Template
Polymer Template 一.Ta的简介 template是polymer element中一个重要的组成部分,主要有两种使用目的,一是构建Shadow Dom,二是用于数据绑定和视图渲染. ...