(四十一)数据持久化的NSCoding实现 -实现普通对象的存取
2015-02-11 21:42
387 查看
NSCoding可以用与存取一般的类对象,需要类成为NSCoding的代理,并且实现编码和解码方法。
假设类Person有name和age两个属性,应该这样设置类:
.h文件:
.m文件
存储Person的方法:
读取Person的方法:
一个细节:
假如有一个Student类继承子Person要存储,如果直接存储,只能调用父类的编码方法,因此子类的特有数据不能保存,应该再重新实现归档函数,但是直接调用父类的归档函数即可初始化原来的数据,再初始化自己的即可。
Tip:通过super调用父类方法可以省去原来属性的初始化。
假设Student多一个学号属性no:
假设类Person有name和age两个属性,应该这样设置类:
.h文件:
#import <Foundation/Foundation.h> @interface Person : NSObject <NSCoding> // 注意要成为代理 @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) int age; @end
.m文件
#import "Person.h" @implementation Person /** * 将对象归档的时候调用 * * @param aCoder 编码对象 */ -(void)encodeWithCoder:(NSCoder *)aCoder{ //编码成员变量并存入相应的key [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeInt:_age forKey:@"age"]; } /** * 将对象从文件中读取的时候调用 * * @param aDecoder 解码对象 * * @return 读取到的对象 */ - (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntForKey:@"age"]; } return self; } @end
存储Person的方法:
Person *p = [[Person alloc] init]; p.name = @"jack"; p.age = 15; NSString *homePath = NSHomeDirectory(); NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"]; NSString *filePath = [docPath stringByAppendingPathComponent:@"test.data"]; //归档 [NSKeyedArchiver archiveRootObject:p toFile:filePath];
读取Person的方法:
NSString *homePath = NSHomeDirectory(); NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"]; NSString *filePath = [docPath stringByAppendingPathComponent:@"test.data"]; //读档(反归档) Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
一个细节:
假如有一个Student类继承子Person要存储,如果直接存储,只能调用父类的编码方法,因此子类的特有数据不能保存,应该再重新实现归档函数,但是直接调用父类的归档函数即可初始化原来的数据,再初始化自己的即可。
Tip:通过super调用父类方法可以省去原来属性的初始化。
假设Student多一个学号属性no:
@interface Student : Person @property (nonatomic, assign) int no; @end
#import "Student.h" @implementation Student -(void)encodeWithCoder:(NSCoder *)aCoder{ [super encodeWithCoder:aCoder]; [aCoder encodeInt:self.no forKey:@"no"]; } - (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super initWithCoder:aDecoder]) { _no = [aDecoder decodeIntForKey:@"no"]; } return self; } @end
相关文章推荐
- (四十一)数据持久化的NSCoding实现 -实现普通对象的存取
- OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co
- 通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法
- 实现数据模型缓存 可以用NSKeyedArchiver类来实现数据模型缓存。为了把模型对象用NSKeyedArchiver归档,模型类需要遵循NSCoding协议。
- iOS 数据存储 归档普通对象 NSCoding NSKeyedArchiver
- 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数
- 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数
- Adodb.Stream是ADO的Stream对象,提供存取二进制数据或者文本流,从而实现对流的读、写和管理等操作.
- ios-day12-04(ios开发中数据存储之NSKeyedArchiver归档(NSCoding)、普通对象如何归档、普通对象的子类如何归档)
- Adodb.Stream是ADO的Stream对象,提供存取二进制数据或者文本流,从而实现对流的读、写和管理等操作.
- ios-day13-01(私人通讯录。控制器之间的数据传递、保存密码和自动登录的实现、普通对象的归档、UITableView的局部刷新和向左滑动删除功能等等)
- 通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法
- (转贴)用DELPHI的RTTI实现对象的XML持久化
- 使用ADO实现BLOB数据的存取
- Scott Mitchell 的ASP.NET 2.0数据教程之四十一::实现开放式并发
- 书讯 -- 一致化对象与数据的存取 LINQ
- 在典型的多层实现中,创建和刷新DataSet对象并依次更新原始数据的步骤
- 在实际开发中碰到的小问题,保存数据时提示:对象必须实现 IConvertible
- Asp.net下的对象成员数据绑定器实现
- 利用反射和自定义特性实现基本数据存取操作自动获取