IOS通过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);
    
}

展开阅读全文

没有更多推荐了,返回首页