iOS nscoding 实现归档解档

来源:互联网 发布:数联铭品 知乎 编辑:程序博客网 时间:2024/04/30 06:50

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

[cpp] view plain copy
  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.   
  9. #import "UserEntity.h"  
  10. #import "AddressEntity.h"  
  11.   
  12. #define SAMPLEDATA_KEY_USERNAME (@"userName")    
  13. #define SAMPLEDATA_KEY_GENDER (@"gender")    
  14. #define SAMPLEDATA_KEY_AGE (@"age")  
  15. #define k_FRIENDS (@"frinds")  
  16. #define k_ADDRESS (@"address")  
  17. #define k_userEntity_addresses (@"addresses")  
  18.   
  19. @implementation UserEntity  
  20. @synthesize userName = _userName;  
  21. @synthesize gender   = _gender;  
  22. @synthesize age      = _age;  
  23. @synthesize friends  = _friends;  
  24. @synthesize address  = _address;  
  25. @synthesize addresses = _addresses;  
  26.   
  27. -(void)dealloc  
  28. {  
  29.     [self.userName release];  
  30.     [self.friends release];  
  31.     [self.address release];  
  32.     [self.addresses release];  
  33.     [super dealloc];  
  34. }  
  35.   
  36.   - (void)encodeWithCoder:(NSCoder*)coder    
  37.   {    
  38.       [coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME];  
  39.       [coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE];  
  40.       [coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER];  
  41.       [coder encodeObject:self.friends forKey:k_FRIENDS];  
  42.       [coder encodeObject:self.address forKey:k_ADDRESS];  
  43.       [coder encodeObject:self.addresses forKey:k_userEntity_addresses];  
  44.   }    
  45.   
  46.   - (id)initWithCoder:(NSCoder*)decoder    
  47.   {    
  48.       if (self = [super init])  
  49.       {  
  50.           if (decoder == nil)  
  51.           {  
  52.               return self;  
  53.           }  
  54.           self.userName = [decoder decodeObjectForKey:SAMPLEDATA_KEY_USERNAME];  
  55.           self.gender = [decoder decodeBoolForKey:SAMPLEDATA_KEY_GENDER];  
  56.           self.age = [decoder decodeIntForKey:SAMPLEDATA_KEY_AGE];  
  57.           self.friends = [decoder decodeObjectForKey:k_FRIENDS];  
  58.           self.address = [decoder decodeObjectForKey:k_ADDRESS];  
  59.           self.addresses = [decoder decodeObjectForKey: k_userEntity_addresses];  
  60.       }  
  61.       return self;  
  62.   }   
  63.   
  64. @end  

[cpp] view plain copy
  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.   
  9. #import "AddressEntity.h"  
  10. #define k_Id (@"id")    
  11. #define k_AddresEntity_address (@"addrss")    
  12.   
  13.   
  14. @implementation AddressEntity  
  15. @synthesize Id, address;  
  16. -(void)dealloc  
  17. {  
  18.     [self.address release];  
  19.     [super dealloc];  
  20. }  
  21. - (NSString *)description  
  22. {  
  23.   
  24.     return [NSString stringWithFormat:@"id :%d address: %@" , self.Id, self.address];  
  25. }  
  26.   
  27. - (void)encodeWithCoder:(NSCoder*)coder    
  28. {    
  29.     [coder encodeObject:self.address forKey:k_AddresEntity_address];  
  30.     [coder encodeInt:self.Id forKey:k_Id];  
  31.   
  32. }    
  33.   
  34. - (id)initWithCoder:(NSCoder*)decoder    
  35. {    
  36.     if (self = [super init])  
  37.     {  
  38.         if (decoder == nil)  
  39.         {  
  40.             return self;  
  41.         }  
  42.         self.address = [decoder decodeObjectForKey:k_AddresEntity_address];  
  43.         self.Id = [decoder decodeIntForKey:k_Id];  
  44.   
  45.     }  
  46.     return self;  
  47. }   
  48. @end  

[cpp] view plain copy
  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.       
  7.     NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];  
  8.       
  9.     NSMutableData *data = [[[NSMutableData alloc] init] autorelease];  
  10.     NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];  
  11.     UserEntity *userEntity = [[[UserEntity alloc] init] autorelease];  
  12.     userEntity.age = 18;  
  13.     userEntity.gender = NO;  
  14.     userEntity.userName = @"add";  
  15.       
  16.     NSArray *friends = [[NSArray alloc] initWithObjects:@"ac", @"2", @"3", @"4", nil];  
  17.     userEntity.friends = friends;  
  18.       
  19.     AddressEntity *address = [[[AddressEntity alloc] init] autorelease];  
  20.     address.Id = 1;  
  21.     address.address = @"china";  
  22.     userEntity.address = address;  
  23.       
  24.     AddressEntity *address2 = [[[AddressEntity alloc] init] autorelease];  
  25.     address2.Id = 2;  
  26.     address2.address = @"china2";  
  27.       
  28.     AddressEntity *address3 = [[[AddressEntity alloc] init] autorelease];  
  29.     address3.Id = 3;  
  30.     address3.address = @"china3";  
  31.       
  32.     NSArray *addresses = [[NSArray alloc] initWithObjects:address2, address3 , nil];  
  33.       
  34.     userEntity.addresses = addresses;  
  35.       
  36.     [archiver encodeObject:userEntity forKey:@"KEY"];  
  37.     [archiver finishEncoding];  
  38.     BOOL success = [data writeToFile:filePath atomically:YES];  
  39.       
  40.       
  41. }  
  42.   
  43. -(IBAction)read:(id)sender  
  44. {  
  45.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  46.     NSString *documentsDirectory = [paths objectAtIndex:0];  
  47.       
  48.     NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];  
  49.       
  50.     NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];  
  51.       
  52.     NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];  
  53.     UserEntity *userEntity = [unArchiver decodeObjectForKey:@"KEY"];  
  54.     NSLog(@"name is %@ , friend %@ address :%@ , addresses is :%@", userEntity.userName , userEntity.friends , userEntity.address, userEntity.addresses);  
  55.       
0 0
原创粉丝点击