IOS学习之NSKeyedArchiver、NSKeyedUnarchiver归档

IOS保存文件的其中一种形式是NSKeyedArchiver、NSKeyedUnarchiver归档:

以下内容以一个to-do lists软件为例,ChecklistItem为一个项目(数据模型),包含一个字符串text和一个BOOL标记checked,items是视图控制器的NSMutableArray,包含多个ChecklistItem,保存数据时以items为整体保存到.plist文件,读取则一样。

1.首先在数据模型的.h文件中实现协议<NSCoding>,例如:

@interface ChecklistItem : NSObject <NSCoding>

2.添加encode和decode方法(NSCoder归档和解档时会调用)

-(void)encodeWithCoder:(NSCoder *)aCoder

{

[aCoder encodeObject:self.text forKey:@"Text"];

[aCoder encodeBool:self.checked forKey:@"Checked"];

}

-(id)initWithCoder:(NSCoder *)aDecoder

{

if((self = [super init]))

{

self.text = [aDecoder decodeObjectForKey:@"Text"];

self.checked = [aDecoder decodeBoolForKey:@"Checked"];

}

return self;

}

3.获取app沙盒Document路径和保存的文件名

-(NSString *)documentsDirectory

{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths firstObject];

return documentsDirectory;

}

-(NSString *)dataFilePath

{

return [[self documentsDirectory] stringByAppendingPathComponent:@"Checklists.plist"];

}

4.在视图控制器中实现保存和读取.plist文件的方法

-(void)saveChecklistItems

{

NSMutableData *data = [[NSMutableData alloc]init];

NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

[archiver encodeObject:_items forKey:@"ChecklistItems"];

[archiver finishEncoding];

[data writeToFile:[self dataFilePath] atomically:YES];

}

-(void)loadChecklistItems

{

NSString *path = [self dataFilePath];

if([[NSFileManager defaultManager] fileExistsAtPath:path])

{

NSData *data = [[NSData alloc] initWithContentsOfFile:path];

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

_items = [unarchiver decodeObjectForKey:@"ChecklistItems"];

[unarchiver finishDecoding];

}

else

{

_items = [[NSMutableArray alloc]initWithCapacity:20];

}

}

5.当视图从storyboard解档时,读取.plist文件(如果存在的话)

-(id)initWithCoder:(NSCoder *)aDecoder

{

if((self = [super initWithCoder:aDecoder]))

{

[self loadChecklistItems];

}

return self;

}

6.在需要保存数据的操作方法中(添加、删除、修改一个项目)调用保存数据方法

[self saveChecklistItems];

时间: 2024-10-25 18:02:29

IOS学习之NSKeyedArchiver、NSKeyedUnarchiver归档的相关文章

IOS中利用NSKeyedArchiver进行数据的归档和恢复

1.相关知识点: <1> 可以利用NSKeyedArchiver 进行归档和恢复的对象类型:NSString .NSDictionary.NSArray.NSData.                        NSNumber等 <2> 使用是必须遵循NSCoding协议对象,实现两个方法: encodeWithCoder:归档对象时,将会调用该方法. initWithCoder:每次从文件中恢复对象时,调用该方法. 2.简单例子阐述详细步骤 <1> 创建一个学生

iOS数据持久化存储之归档NSKeyedArchiver

归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),收集了网上的一些资料并结合自己的一些经验,总结如下. 一.使用archiveRootObject进行简单的归档 使用NSKeyedArichiver进行归档.NSKeyedUnarchiver进行接档,这种方式会在写入.读出数据之前对数据进行序列化.反序列化操作. 归档:  //1.获取文件路径 NSString *docPath=[NSSearchPathForDirectoriesInDomai

iOS 学习笔记——0005(数据存储)

先发一个练手的小demo,自己写的简略通讯录,已上传至github https://github.com/liaoshaolim/addressBook 1.NSKeyedArchiver:(归档) 这里用一个添加联系人的例子来说明: 注意:归档形式保存数据,需要该对象遵守NSCoding协议,而且对应的必须提供encodeWithCoder和initWithCoder方法 因为归档是一次性的,解压也是一次性的,所以小量的ok,如果量大的话,改一个小地方就要归档或解压全部,效率会比较低 //用一

iOS学习笔记-数据持久化

在iOS学习过程中,有时候需要保持用户数据,比如登录信息.用户的设置选项等,这时候就需要学习数据持久化操作,本节主要学习iOS数据持久化相关的知识. 数据持久化的方式有四种: 1).写入plist文件(属性列表) 2).偏好设置 3).归档(NSKeyedArchiver) 4).NSData 下面分别举例说明四种方式的适用场合以及用法. 1. 写入plist文件(属性列表) 1.1 plist可以存储哪些数据 属性列表是一种XML格式的文件,拓展名为plist 如果对象是NSString.NS

OS开发UI篇—ios应用数据存储方式(归档)

OS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 02

iOS开发UI篇—ios应用数据存储方式(归档)

iOS开发UI篇-ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 0

iOS数据持久化之二——归档与设计可存储化的数据模型基类

iOS数据持久化之二--归档与设计可存储化的数据模型基类 一.引言 在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法.虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性.试想,如果我们可以将用户的登录返回信息模型,游戏中角色的属性信息模型进行直接的持久化存取,那是不是非常爽的事,幸运的是,我们可以通过归档,来设计一个这样的数据模型. 二.先来精通归档吧 归档也是iOS提供给开发者的一种数据存储的方式,事实上,几乎所有的数据类型都可以通过归档来进行存取.其存储与读取

IOS学习笔记 -- Segue、数据存储、UITabBarController

一. Segue1.Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)每一个Segue对象,都有3个属性1>.唯一标识: @property (nonatomic, readonly) NSString *identifier;2>.来源控制器: @property (nonatomic, readonly) id sourceViewController;3>.目标控制器: @property (nonatomic, read

IOS学习笔记--Objective-C之Foundation框架

概述 原文地址:http://www.cnblogs.com/kenshincui/p/3885689.html 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么 这个对象到底是谁?它为什么又出现在Objective-C中间呢?今天我们将揭开这层面纱,重点分析在IOS开发中一个重要的框架 Foundation,今天的主要内容有: Foundation概述 常用结构