归档:数据从内存与闪存相互转化,类似“序列化”,将数据转换成二进制字节数据

操作:有两种方式,第一种是单个对象作为root进行归档和恢复,一个对象一个文件;第二种,可以同时归档多个对象到一个文件

注意:归档自定义对象,需要实现NSCoding协议里的两个方法,举例说明:【preference】http://blog.csdn.net/mad1989/article/details/9106475

一、创建一个数据模型(自定义类)

现在就以大家常见的Student的为例,这个模型有5个参数:name、age、weight、hobby、others

Student.h

  1. #import <Foundation/Foundation.h>
  2. @interface Student : NSObject<NSCoding,NSCopying>
  3. @property(copy,nonatomic) NSString *name;
  4. @property(assign,nonatomic) int age;
  5. @property(assign,nonatomic) double  weight;
  6. @property(copy,nonatomic) NSArray *hobby;
  7. @property(copy,nonatomic) NSDictionary *others;
  8. @end

Student.m

  1. #import "Student.h"
  2. #define knameKey @"name"
  3. #define kageKey @"age"
  4. #define kweightKey @"weight"
  5. #define khobbyKey @"hobby"
  6. #define kotherKey @"others"
  7. @implementation Student
  8. @synthesize name;
  9. @synthesize age;
  10. @synthesize weight;
  11. @synthesize hobby;
  12. @synthesize others;
  13. #pragma mark-NSCoding
  14. -(void)encodeWithCoder:(NSCoder *)aCoder{
  15. [aCoder encodeObject:name forKey:knameKey];
  16. [aCoder encodeInt:age forKey:kageKey];
  17. [aCoder encodeDouble:weight forKey:kweightKey];
  18. [aCoder encodeObject:hobby forKey:khobbyKey];
  19. [aCoder encodeObject:others forKey:kotherKey];
  20. }
  21. -(id)initWithCoder:(NSCoder *)aDecoder{
  22. if (self == [super init]) {
  23. name =  [aDecoder decodeObjectForKey:knameKey];
  24. age = [aDecoder decodeIntForKey:kageKey];
  25. weight =  [aDecoder decodeDoubleForKey:kweightKey];
  26. hobby =  [aDecoder decodeObjectForKey:khobbyKey];
  27. others =  [aDecoder decodeObjectForKey:kotherKey];
  28. }
  29. return self;
  30. }
  31. #pragma mark-NSCopying
  32. -(id)copyWithZone:(NSZone *)zone{
  33. Student *copy = [[[self class] allocWithZone:zone] init];
  34. copy.name = [self.name copyWithZone:zone];
  35. copy.age = self.age;
  36. copy.weight = self.weight;
  37. copy.hobby = [self.hobby copyWithZone:zone];
  38. copy.others = [self.others copyWithZone:zone];
  39. return copy;
  40. }
  41. @end

通过以上的代码我们可以看出,要实现对数据模型的归档,需要我们实现NScoding协议,NScoping(copy协议是为了模型数据可以复制,对于归档而言,不是必须要实现)

NScoding协议需要实现两个方法:

-(void)encodeWithCoder:(NSCoder *)aCoder    以keyValue形式对基本数据类型Encoding

-(id)initWithCoder:(NSCoder *)aDecoder
     以keyValue形式对基本数据类型Decoding,返回数据模型本身

-(id)copyWithZone:(NSZone *)zone      NScopying协议的方法,目的为了实现数据模型的copy,如下实例:

  1. Student *s1 = [[Student alloc] init];
  2. Student *s2 = [s1 copy];
  3. NSLog(@"s1:%@",s1);
  4. NSLog(@"s2:%@",s2);

Log控制台输出:

2013-06-16 16:19:36.157 ArchiveDemo[1357:c07] s1:<Student: 0x8875340>

2013-06-16 16:19:36.158 ArchiveDemo[1357:c07] s2:<Student: 0x8875360>

二、ViewController.xib添加几个针对数据模型的可编辑组件:

三、接下来就是在Viewcontroller.m中的操作,首先添加一个内部使用的方法,返回要保存到闪存的位置:

  1. -(NSString *) getFilePath{
  2. NSArray *array =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  3. return [[array objectAtIndex:0] stringByAppendingPathComponent:kFileName];
  4. }

在ViewDidLoad方法里,每次viewController初始化时,读取路径下的归档文件,读取数据模型数据。同时添加一个通知每当按下Home键时,数据及时归档到闪存中。

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. if ([[NSFileManager defaultManager] fileExistsAtPath:[self getFilePath]]) {
  5. NSLog(@"filePAth:%@",[self getFilePath]);
  6. NSData *data = [[NSData alloc] initWithContentsOfFile:[self getFilePath]];
  7. NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
  8. //解档出数据模型Student
  9. Student *mStudent = [unarchiver decodeObjectForKey:kDataKey];
  10. [unarchiver finishDecoding];//一定不要忘记finishDecoding,否则会报错
  11. //接档后就可以直接使用了(赋值到相应的组件属性上)
  12. self.nameLabel.text = mStudent.name;
  13. self.ageLabel.text = [NSString stringWithFormat:@"%d",mStudent.age];
  14. self.weightLabel.text = [NSString stringWithFormat:@"%f",mStudent.weight];
  15. self.hobbyTextField.text = [mStudent.hobby objectAtIndex:0];
  16. self.othersTextView.text = [mStudent.others objectForKey:@"other"];
  17. [unarchiver release];
  18. [data release];
  19. }
  20. //添加一个广播,用于注册当用户按下home键时,归档数据到闪存中
  21. UIApplication *app = [UIApplication sharedApplication];
  22. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveAppDataWhenApplicationWillResignActive) name:UIApplicationWillResignActiveNotification object:app];
  23. }

四、某一操作需要保存数据的时候,及时归档到闪存中

  1. /**
  2. *当用户按下Home键,返回桌面时,归档当前数据到指定文件路径下
  3. */
  4. -(void) saveAppDataWhenApplicationWillResignActive:(NSNotification*) notification{
  5. Student *saveStudent = [[Student alloc] init];
  6. saveStudent.name = self.nameLabel.text;
  7. saveStudent.age = [self.ageLabel.text intValue];
  8. saveStudent.weight = [self.weightLabel.text doubleValue];
  9. saveStudent.hobby = [NSArray arrayWithObjects:self.hobbyTextField.text, nil];
  10. saveStudent.others = [NSDictionary dictionaryWithObjectsAndKeys:self.othersTextView.text,@"other",nil];
  11. NSMutableData *data = [[NSMutableData alloc] init];
  12. NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
  13. [archiver encodeObject:saveStudent forKey:kDataKey];
  14. [archiver finishEncoding];
  15. [data writeToFile:[self getFilePath] atomically:YES];
  16. [data release];
  17. [archiver release];
  18. [saveStudent release];
  19. }

运行效果:

重新运行后:

归档这种保存方式缺点就是没有属性列表(NSuserDefault)速度快,因为它每次都要把文件保存到闪存中,优点是可以创建自己想要的数据模型,然后统一以模型方式存储,比属性列表要过分依赖Key要省心。

ios数据存储——对象归档的更多相关文章

  1. IOS数据存储之归档/解档

    前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...

  2. iOS数据存储之对象归档

    iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...

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

    iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同 ...

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

    本文转发至:文顶顶http://www.cnblogs.com/wendingding/p/3775293.html iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist ...

  5. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  6. iOS数据存储类型 及 堆(heap)和栈(stack)

    iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...

  7. iOS 数据持久性存储-对象归档

    对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使用的时候读取该文件的保存路径读取文件的内容(也称为解档,反序列化) 主要涉及两个类:NSKeyedArichiver.NSKey ...

  8. ios应用数据存储方式(归档) - 转

    一.简单说明  1.在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦.  2.偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置 ...

  9. IOS 数据存储(NSKeyedArchiver 归档篇)

    什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...

随机推荐

  1. android viewpager 深究

    参考: http://blog.csdn.net/xushuaic/article/details/42638311 GitHub上相关的ViewPager动画的项目 https://github.c ...

  2. Mysql笔记3数据库基本操作

    1 创建数据库 create database 数据名称 default character set 编码; 2查看常用的编码校验规则 mysql> show character set; 3删 ...

  3. iOS开发-正则表达式3种形式

    转至:http://www.cnblogs.com/GarveyCalvin/p/4250145.html iOS开发-正则表达式的使用方法 前 言:在表单验证中,我们经常会使用到正则,因为我们需要用 ...

  4. 关于Jsp页面在ww:iterator 标签里面判断的写法是可以直接写数组里面的变量的

    因为上面已经遍历了,所以可以直接写变量名

  5. zf-关于把某个地址的svn项目移动到另一个上面的步骤

    1 首先查检出来 2 然后断开连接 删除元信息(这个必须注意,很敏感的,不然酒吧元信息带入到了另外一个svn地址中了) 3 之后再到另外一个svn上建立远程资源文件,把项目导入进去,注意不要导入错了, ...

  6. 数的计数(number)

    数的计数(number) 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n),先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: (1)不作任何处理: (2)在它的 ...

  7. HDU 2846 Repository(字典树)

    字典树较为复杂的应用,我们在建立字典树的过程中需要把所有的前缀都加进去,还需要加一个id,判断它原先是属于哪个串的.有人说是AC自动机的简化,但是AC自动机我还没有做过. #include<io ...

  8. Chapter 1 First Sight——5

    "He's in a wheelchair now," Charlie continued when I didn't respond, 他现在在轮椅上了,没等我回答查理斯就继续说 ...

  9. webapp之路--之必备知识

    移动设备的用户越来越多,每天android手机的激活量都已经超过130万台,所以我们面向移动终端的WebAPP也开始跟进了.本文主要介绍webapp的开发与调试的相关知识和经验,以及给出几种可选的解决 ...

  10. CTabCtrl

    转载至 http://blog.csdn.net/jacklam200/archive/2008/08/01/2753797.aspx 一.在对话框视图中加入CTabCtrl控件 资源ID:IDC_T ...