在IOS的开发中,小数据量的持久化都用NSUserDefaults来实现,但是NSUserDefaults只能保存NSString, NSNumber, NSDate, NSArray, NSDictionary这些数据类型,但大多时候,我们会将一个对象实体做持久化的保存,由于不是大批量的数据,不会用到sqlite,那么这个时候NSUserDefaults会是很好的选择,其实对象类型可以通过NSCoding的委托方法来实现的。

  1. View Code //
  2. //  UserEntity.m
  3. //  NSCodingDemo
  4. //
  5. //  Created by   on 11-5-20.
  6. //  Copyright 2011  , Inc. All rights reserved.
  7. //
  8. #import "UserEntity.h"
  9. #import "AddressEntity.h"
  10. #define SAMPLEDATA_KEY_USERNAME (@"userName")
  11. #define SAMPLEDATA_KEY_GENDER (@"gender")
  12. #define SAMPLEDATA_KEY_AGE (@"age")
  13. #define k_FRIENDS (@"frinds")
  14. #define k_ADDRESS (@"address")
  15. #define k_userEntity_addresses (@"addresses")
  16. @implementation UserEntity
  17. @synthesize userName = _userName;
  18. @synthesize gender   = _gender;
  19. @synthesize age      = _age;
  20. @synthesize friends  = _friends;
  21. @synthesize address  = _address;
  22. @synthesize addresses = _addresses;
  23. -(void)dealloc
  24. {
  25. [self.userName release];
  26. [self.friends release];
  27. [self.address release];
  28. [self.addresses release];
  29. [super dealloc];
  30. }
  31. - (void)encodeWithCoder:(NSCoder*)coder
  32. {
  33. [coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME];
  34. [coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE];
  35. [coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER];
  36. [coder encodeObject:self.friends forKey:k_FRIENDS];
  37. [coder encodeObject:self.address forKey:k_ADDRESS];
  38. [coder encodeObject:self.addresses forKey:k_userEntity_addresses];
  39. }
  40. - (id)initWithCoder:(NSCoder*)decoder
  41. {
  42. if (self = [super init])
  43. {
  44. if (decoder == nil)
  45. {
  46. return self;
  47. }
  48. self.userName = [decoder decodeObjectForKey:SAMPLEDATA_KEY_USERNAME];
  49. self.gender = [decoder decodeBoolForKey:SAMPLEDATA_KEY_GENDER];
  50. self.age = [decoder decodeIntForKey:SAMPLEDATA_KEY_AGE];
  51. self.friends = [decoder decodeObjectForKey:k_FRIENDS];
  52. self.address = [decoder decodeObjectForKey:k_ADDRESS];
  53. self.addresses = [decoder decodeObjectForKey: k_userEntity_addresses];
  54. }
  55. return self;
  56. }
  57. @end
  1. View Code //
  2. //  AddressEntity.m
  3. //  NSCodingDemo
  4. //
  5. //  Created by   on 11-5-20.
  6. //  Copyright 2011  , Inc. All rights reserved.
  7. //
  8. #import "AddressEntity.h"
  9. #define k_Id (@"id")
  10. #define k_AddresEntity_address (@"addrss")
  11. @implementation AddressEntity
  12. @synthesize Id, address;
  13. -(void)dealloc
  14. {
  15. [self.address release];
  16. [super dealloc];
  17. }
  18. - (NSString *)description
  19. {
  20. return [NSString stringWithFormat:@"id :%d address: %@" , self.Id, self.address];
  21. }
  22. - (void)encodeWithCoder:(NSCoder*)coder
  23. {
  24. [coder encodeObject:self.address forKey:k_AddresEntity_address];
  25. [coder encodeInt:self.Id forKey:k_Id];
  26. }
  27. - (id)initWithCoder:(NSCoder*)decoder
  28. {
  29. if (self = [super init])
  30. {
  31. if (decoder == nil)
  32. {
  33. return self;
  34. }
  35. self.address = [decoder decodeObjectForKey:k_AddresEntity_address];
  36. self.Id = [decoder decodeIntForKey:k_Id];
  37. }
  38. return self;
  39. }
  40. @end
    1. View Code -(IBAction)write:(id)sender
    2. {
    3. //get document path
    4. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    5. NSString *documentsDirectory = [paths objectAtIndex:0];
    6. NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
    7. NSMutableData *data = [[[NSMutableData alloc] init] autorelease];
    8. NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
    9. UserEntity *userEntity = [[[UserEntity alloc] init] autorelease];
    10. userEntity.age = 18;
    11. userEntity.gender = NO;
    12. userEntity.userName = @"add";
    13. NSArray *friends = [[NSArray alloc] initWithObjects:@"ac", @"2", @"3", @"4", nil];
    14. userEntity.friends = friends;
    15. AddressEntity *address = [[[AddressEntity alloc] init] autorelease];
    16. address.Id = 1;
    17. address.address = @"china";
    18. userEntity.address = address;
    19. AddressEntity *address2 = [[[AddressEntity alloc] init] autorelease];
    20. address2.Id = 2;
    21. address2.address = @"china2";
    22. AddressEntity *address3 = [[[AddressEntity alloc] init] autorelease];
    23. address3.Id = 3;
    24. address3.address = @"china3";
    25. NSArray *addresses = [[NSArray alloc] initWithObjects:address2, address3 , nil];
    26. userEntity.addresses = addresses;
    27. [archiver encodeObject:userEntity forKey:@"KEY"];
    28. [archiver finishEncoding];
    29. BOOL success = [data writeToFile:filePath atomically:YES];
    30. }
    31. -(IBAction)read:(id)sender
    32. {
    33. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    34. NSString *documentsDirectory = [paths objectAtIndex:0];
    35. NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
    36. NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
    37. NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    38. UserEntity *userEntity = [unArchiver decodeObjectForKey:@"KEY"];
    39. NSLog(@"name is %@ , friend %@ address :%@ , addresses is :%@", userEntity.userName , userEntity.friends , userEntity.address, userEntity.addresses);
    40. }

NSCoding的更多相关文章

  1. iOS 数据序列化,NSCoding, NSCoder

    iOS可以利用NSKeyedArchiver类将对象序列化成NSData存储在磁盘上,但前提是该对象所属的类必须遵从NSCoding协议. NSCoding协议包含两个方法,要序列化的类必须实现它们 ...

  2. Objective-C NSData与实现NSCoding协议进行序列化和反序列化

    1.NSData NSData是Objective-C语言中数据的基本类型,其成分可以理解为字节指针和长度的封装的类,来看看源代码 @interface NSData : NSObject <N ...

  3. [转载]iOS 归档操作 NSCoding

    最近一个项目需要保存到本地文件,想用plist,但是发现很多内容是自定义的,于是只能自己归档接档.不难,找了一篇范文大家保存一下,方便以后学习使用. 转自:http://mobile.51cto.co ...

  4. NSCoding归档

    大家都知道ios中数据持久化的方式有plist sqlite coredata nscoding 而nscoding不需要关心模型属性有多少个,是什么类型,不需要定义归档文件的规则. 下面给个类大家用 ...

  5. IOS开发-- NScoding 序列化

    开篇 1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教 ...

  6. ios 沙盒 NSCoding(相当于JAVA对象序列化) 归档 数据存储

    通过NSCoding能实现像JAVA一样能够实现对象的序列化,可以保存对象到文件里. NSCoding 跟其他存储方式略有不同,他可以存储对象 对象存储的条件是: 对象需要遵守 NSCoding 协议 ...

  7. iOS开发——OC篇&协议篇/NSCoder/NSCoding/NSCoping

    协议篇/NSCoder/NSCoding/NSCoping 协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(f ...

  8. Runtime之NSCoding的自动归档、接档

    为什么要有Runtime的NSCoding的自动归档.接档 大家所熟知的方法 //归档方法 - (void)encodeWithCoder:(NSCoder *)aCoder { //当学生被归档,学 ...

  9. (四十一)数据持久化的NSCoding实现 -实现普通对象的存取

    NSCoding可以用与存取一般的类对象,需要类成为NSCoding的代理,并且实现编码和解码方法. 假设类Person有name和age两个属性,应该这样设置类: .h文件: #import < ...

  10. Runtime应用(三)实现NSCoding的自动归档和自动解档

    当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法.例如有一个Person类,该类有两个成员变量 @property (nonatomic,copy) NS ...

随机推荐

  1. T9270 mjt树

    题目背景 从前森林里有一棵很大的mjt树,树上有很多小动物. 题目描述 mjt树上有 n 个房间,第 i 个房间住着 ai 只第bi 种小动物. 这n个房间用n-1条路连接起来,其中房间1位mjt树的 ...

  2. SQL Server 存储字符数较大字段的问题

    SQL Server 2000专门提供了处理text,ntext,image字段的函数,他们是: TEXTPTR TEXTVALID READTEXT UPDATETEXT WRITETEXT 一般作 ...

  3. R12: How to add Microsoft Excel as Type to the Create Template List of Values in BI Publisher (Doc ID 1343225.1)

    Modified: 27-Oct-2013 Type: HOWTO In this Document Goal Solution References APPLIES TO: BI Publisher ...

  4. 深入研究Clang(五) Clang Lexer代码阅读笔记之Lexer

    作者:史宁宁(snsn1984) Clang的Lexer(词法分析器)的源代码的主要位置例如以下: clang/lib/Lex    这里是基本的Lexer的代码: clang/include/cla ...

  5. Unity3d插件]EasyTouch简单使用方法

    EasyTouch使用 EasyTouch 文件夹[-] 一.效果图 二.操作步骤 1.官方文档上的步骤 2.翻译一下以上的步骤 3.依据官方的这些提示.自己来做一个属于自己的人物遥感控制 对于移动平 ...

  6. 向量空间模型实现文档查询(Vector Space Model to realize document query)

    xml中文档(query)的结构: <topic> <number>CIRB010TopicZH006</number> <title>科索沃難民潮&l ...

  7. 整理对Spark SQL的理解

    Catalyst Catalyst是与Spark解耦的一个独立库,是一个impl-free的运行计划的生成和优化框架. 眼下与Spark Core还是耦合的.对此user邮件组里有人对此提出疑问,见m ...

  8. 细说linux IPC(三):mmap系统调用共享内存

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途]         前面讲到socket的进程间通 ...

  9. ORA-07445 第一參数为:kkqljpmpr

      在版本号11.2.0.1.0上,在pl/sql developer中运行一条SQL会导致连接中断,这样的错误要到trace文件夹下找到错误日志文件,再定位.查了一下资料,是这个版本号的bug. D ...

  10. centos6.3升级python至2.7.5

    centos6.3自带的python版本是2.6.6,有时候需要升级到2.7.这里记录一下升级过程,方便查阅.实际上是转载自http://flyingdutchman.iteye.com/blog/1 ...