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