IOS通过NSCoding保存实体对象
2013-09-17 09:55
232 查看
在IOS的开发中,小数据量的持久化都用NSUserDefaults来实现,但是NSUserDefaults只能保存NSString, NSNumber, NSDate, NSArray, NSDictionary这些数据类型,但大多时候,我们会将一个对象实体做持久化的保存,由于不是大批量的数据,不会用到sqlite,那么这个时候NSUserDefaults会是很好的选择,其实对象类型可以通过NSCoding的委托方法来实现的。
[cpp] view
plaincopy
View Code //
// UserEntity.m
// NSCodingDemo
//
// Created by on 11-5-20.
// Copyright 2011 , Inc. All rights reserved.
//
#import "UserEntity.h"
#import "AddressEntity.h"
#define SAMPLEDATA_KEY_USERNAME (@"userName")
#define SAMPLEDATA_KEY_GENDER (@"gender")
#define SAMPLEDATA_KEY_AGE (@"age")
#define k_FRIENDS (@"frinds")
#define k_ADDRESS (@"address")
#define k_userEntity_addresses (@"addresses")
@implementation UserEntity
@synthesize userName = _userName;
@synthesize gender = _gender;
@synthesize age = _age;
@synthesize friends = _friends;
@synthesize address = _address;
@synthesize addresses = _addresses;
-(void)dealloc
{
[self.userName release];
[self.friends release];
[self.address release];
[self.addresses release];
[super dealloc];
}
- (void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME];
[coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE];
[coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER];
[coder encodeObject:self.friends forKey:k_FRIENDS];
[coder encodeObject:self.address forKey:k_ADDRESS];
[coder encodeObject:self.addresses forKey:k_userEntity_addresses];
}
- (id)initWithCoder:(NSCoder*)decoder
{
if (self = [super init])
{
if (decoder == nil)
{
return self;
}
self.userName = [decoder decodeObjectForKey:SAMPLEDATA_KEY_USERNAME];
self.gender = [decoder decodeBoolForKey:SAMPLEDATA_KEY_GENDER];
self.age = [decoder decodeIntForKey:SAMPLEDATA_KEY_AGE];
self.friends = [decoder decodeObjectForKey:k_FRIENDS];
self.address = [decoder decodeObjectForKey:k_ADDRESS];
self.addresses = [decoder decodeObjectForKey: k_userEntity_addresses];
}
return self;
}
@end
[cpp] view
plaincopy
View Code //
// AddressEntity.m
// NSCodingDemo
//
// Created by on 11-5-20.
// Copyright 2011 , Inc. All rights reserved.
//
#import "AddressEntity.h"
#define k_Id (@"id")
#define k_AddresEntity_address (@"addrss")
@implementation AddressEntity
@synthesize Id, address;
-(void)dealloc
{
[self.address release];
[super dealloc];
}
- (NSString *)description
{
return [NSString stringWithFormat:@"id :%d address: %@" , self.Id, self.address];
}
- (void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeObject:self.address forKey:k_AddresEntity_address];
[coder encodeInt:self.Id forKey:k_Id];
}
- (id)initWithCoder:(NSCoder*)decoder
{
if (self = [super init])
{
if (decoder == nil)
{
return self;
}
self.address = [decoder decodeObjectForKey:k_AddresEntity_address];
self.Id = [decoder decodeIntForKey:k_Id];
}
return self;
}
@end
[cpp] view
plaincopy
View Code -(IBAction)write:(id)sender
{
//get document path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
NSMutableData *data = [[[NSMutableData alloc] init] autorelease];
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
UserEntity *userEntity = [[[UserEntity alloc] init] autorelease];
userEntity.age = 18;
userEntity.gender = NO;
userEntity.userName = @"add";
NSArray *friends = [[NSArray alloc] initWithObjects:@"ac", @"2", @"3", @"4", nil];
userEntity.friends = friends;
AddressEntity *address = [[[AddressEntity alloc] init] autorelease];
address.Id = 1;
address.address = @"china";
userEntity.address = address;
AddressEntity *address2 = [[[AddressEntity alloc] init] autorelease];
address2.Id = 2;
address2.address = @"china2";
AddressEntity *address3 = [[[AddressEntity alloc] init] autorelease];
address3.Id = 3;
address3.address = @"china3";
NSArray *addresses = [[NSArray alloc] initWithObjects:address2, address3 , nil];
userEntity.addresses = addresses;
[archiver encodeObject:userEntity forKey:@"KEY"];
[archiver finishEncoding];
BOOL success = [data writeToFile:filePath atomically:YES];
}
-(IBAction)read:(id)sender
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
UserEntity *userEntity = [unArchiver decodeObjectForKey:@"KEY"];
NSLog(@"name is %@ , friend %@ address :%@ , addresses is :%@", userEntity.userName , userEntity.friends , userEntity.address, userEntity.addresses);
}
[cpp] view
plaincopy
View Code //
// UserEntity.m
// NSCodingDemo
//
// Created by on 11-5-20.
// Copyright 2011 , Inc. All rights reserved.
//
#import "UserEntity.h"
#import "AddressEntity.h"
#define SAMPLEDATA_KEY_USERNAME (@"userName")
#define SAMPLEDATA_KEY_GENDER (@"gender")
#define SAMPLEDATA_KEY_AGE (@"age")
#define k_FRIENDS (@"frinds")
#define k_ADDRESS (@"address")
#define k_userEntity_addresses (@"addresses")
@implementation UserEntity
@synthesize userName = _userName;
@synthesize gender = _gender;
@synthesize age = _age;
@synthesize friends = _friends;
@synthesize address = _address;
@synthesize addresses = _addresses;
-(void)dealloc
{
[self.userName release];
[self.friends release];
[self.address release];
[self.addresses release];
[super dealloc];
}
- (void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME];
[coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE];
[coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER];
[coder encodeObject:self.friends forKey:k_FRIENDS];
[coder encodeObject:self.address forKey:k_ADDRESS];
[coder encodeObject:self.addresses forKey:k_userEntity_addresses];
}
- (id)initWithCoder:(NSCoder*)decoder
{
if (self = [super init])
{
if (decoder == nil)
{
return self;
}
self.userName = [decoder decodeObjectForKey:SAMPLEDATA_KEY_USERNAME];
self.gender = [decoder decodeBoolForKey:SAMPLEDATA_KEY_GENDER];
self.age = [decoder decodeIntForKey:SAMPLEDATA_KEY_AGE];
self.friends = [decoder decodeObjectForKey:k_FRIENDS];
self.address = [decoder decodeObjectForKey:k_ADDRESS];
self.addresses = [decoder decodeObjectForKey: k_userEntity_addresses];
}
return self;
}
@end
[cpp] view
plaincopy
View Code //
// AddressEntity.m
// NSCodingDemo
//
// Created by on 11-5-20.
// Copyright 2011 , Inc. All rights reserved.
//
#import "AddressEntity.h"
#define k_Id (@"id")
#define k_AddresEntity_address (@"addrss")
@implementation AddressEntity
@synthesize Id, address;
-(void)dealloc
{
[self.address release];
[super dealloc];
}
- (NSString *)description
{
return [NSString stringWithFormat:@"id :%d address: %@" , self.Id, self.address];
}
- (void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeObject:self.address forKey:k_AddresEntity_address];
[coder encodeInt:self.Id forKey:k_Id];
}
- (id)initWithCoder:(NSCoder*)decoder
{
if (self = [super init])
{
if (decoder == nil)
{
return self;
}
self.address = [decoder decodeObjectForKey:k_AddresEntity_address];
self.Id = [decoder decodeIntForKey:k_Id];
}
return self;
}
@end
[cpp] view
plaincopy
View Code -(IBAction)write:(id)sender
{
//get document path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
NSMutableData *data = [[[NSMutableData alloc] init] autorelease];
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
UserEntity *userEntity = [[[UserEntity alloc] init] autorelease];
userEntity.age = 18;
userEntity.gender = NO;
userEntity.userName = @"add";
NSArray *friends = [[NSArray alloc] initWithObjects:@"ac", @"2", @"3", @"4", nil];
userEntity.friends = friends;
AddressEntity *address = [[[AddressEntity alloc] init] autorelease];
address.Id = 1;
address.address = @"china";
userEntity.address = address;
AddressEntity *address2 = [[[AddressEntity alloc] init] autorelease];
address2.Id = 2;
address2.address = @"china2";
AddressEntity *address3 = [[[AddressEntity alloc] init] autorelease];
address3.Id = 3;
address3.address = @"china3";
NSArray *addresses = [[NSArray alloc] initWithObjects:address2, address3 , nil];
userEntity.addresses = addresses;
[archiver encodeObject:userEntity forKey:@"KEY"];
[archiver finishEncoding];
BOOL success = [data writeToFile:filePath atomically:YES];
}
-(IBAction)read:(id)sender
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
UserEntity *userEntity = [unArchiver decodeObjectForKey:@"KEY"];
NSLog(@"name is %@ , friend %@ address :%@ , addresses is :%@", userEntity.userName , userEntity.friends , userEntity.address, userEntity.addresses);
}
相关文章推荐
- IOS通过NSCoding保存实体对象
- IOS通过NSCoding保存实体对象
- IOS关于LKDBHelper实体对象映射插件运用
- ios-day12-04(ios开发中数据存储之NSKeyedArchiver归档(NSCoding)、普通对象如何归档、普通对象的子类如何归档)
- 通过反射机制创建对象,类名保存到属性集
- iOS 【transform属性】-通过tramsform熟悉个可以修改对象的平移、缩放比例和旋转角度
- AppDelegate存储全局变量和 NSUserDefaults standardUserDefaults 通过模型保存和读取数据,存储自定义的对象
- 通过反射机制,对将要入库的实体对象的各个属性进行判断,得到最终要更新的实体对象
- iOS中使用KVC实现JSON数据与Objective-C实体对象之间的转换
- iOS 数据存储 归档普通对象 NSCoding NSKeyedArchiver
- 一个很好用的配置类,通过对象系列化保存配置信息
- ios Nscoding协议 序列化 便于磁盘保存
- IOS所有对象实体的基类
- iOS自己定义对象保存到本地文件
- iOS - 保存自定义对象(姓名,性别.....)
- 通过获取客户端Json数据字符串,反序列化为实体对象的一段代码
- ios 通过对象找到它的类名
- iOS之对象保存
- iOS开发——保存自定义对象数组、字典到文件
- [ActionScript 3.0] 通过BitmapData将对象保存成jpg图片