iPhone开发【二十二】数据持久化总结之第3篇—归档(NSKeyedArchiver、NSKeyedUnarchiver)
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8284135 作者:张燕广
实现的功能:1)演示使用归档持久化数据。
关键词:数据持久化 归档 NSKeyedArchiver NSKeyedUnarchiver
1、将上一篇
2、添加Person.h类,如下:
Person.h:
#import <Foundation/Foundation.h>@interface Person : NSObject<NSCoding,NSCopying> @property(nonatomic,retain)NSString *name;@property(nonatomic,retain)NSString *gender;@property(nonatomic,retain)NSString *age;@property(nonatomic,retain)NSString *education;@endPerson.m:
#import "Person.h"#define kNameKey @"name"#define kGenderKey @"gender"#define kAgeKey @"age"#define kEducationKey @"education"@implementation Person@synthesize name,gender,age,education;#pragma mark -#pragma mark NSCoding-(void)encodeWithCoder:(NSCoder *)aCoder{//编码 [aCoder encodeObject:name forKey:kNameKey]; [aCoder encodeObject:gender forKey:kGenderKey]; [aCoder encodeObject:age forKey:kAgeKey]; [aCoder encodeObject:education forKey:kEducationKey];}-(id)initWithCoder:(NSCoder *)aDecoder{//解码 if(self == [super init]){ name = [[aDecoder decodeObjectForKey:kNameKey]retain]; gender = [[aDecoder decodeObjectForKey:kGenderKey]retain]; age = [[aDecoder decodeObjectForKey:kAgeKey]retain]; education = [[aDecoder decodeObjectForKey:kEducationKey]retain]; } return self;}#pragma mark -#pragma mark NSCopying-(id)copyWithZone:(NSZone *)zone{ Person *person = [[[self class]allocWithZone:zone]init]; person.name = [[self.name copyWithZone:zone]autorelease]; person.gender = [[self.gender copyWithZone:zone]autorelease]; person.name = [[self.name copyWithZone:zone]autorelease]; person.name = [[self.name copyWithZone:zone]autorelease]; return person;}@end3、接下来主要修改ViewController
ViewController.h,主要是修改了宏,如下:
//#define kFileName @"data.plist"#define kFileName @"archive"#define kDataKey @"Data"#import <UIKit/UIKit.h>@interface ViewController : UIViewController@property(nonatomic,retain)IBOutlet UITextField *name;@property(nonatomic,retain)IBOutlet UITextField *gender;@property(nonatomic,retain)IBOutlet UITextField *age;@property(nonatomic,retain)IBOutlet UITextField *education;-(NSString *)dataFilePath;-(void)applicationWillResignActive:(NSNotification *)nofication;@end主要修改了ViewController.m,如下:
#import "ViewController.h"#import "Person.h"@implementation ViewController@synthesize name,gender,age,education;-(NSString *)dataFilePath{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:kFileName];}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use.}#pragma mark - View lifecycle- (void)viewDidLoad{// Do any additional setup after loading the view, typically from a nib. NSString *filePath = [self dataFilePath]; NSLog(@"filePath=%@",filePath); if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){ //属性列表 /* NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath]; name.text = [array objectAtIndex:0]; gender.text = [array objectAtIndex:1]; age.text = [array objectAtIndex:2]; education.text = [array objectAtIndex:3]; [array release];*/ NSData *data = [[NSMutableData alloc]initWithContentsOfFile:[self dataFilePath]]; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data]; Person *person = [unarchiver decodeObjectForKey:kDataKey]; [unarchiver finishDecoding]; name.text = person.name; gender.text = person.gender; age.text = person.age; education.text = person.education; [unarchiver release]; [data release]; } UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [super viewDidLoad];}-(void)applicationWillResignActive:(NSNotification *)nofication{ //属性列表 /* NSMutableArray *array = [[NSMutableArray alloc]init]; [array addObject:name.text]; [array addObject:gender.text]; [array addObject:age.text]; [array addObject:education.text]; [array writeToFile:[self dataFilePath] atomically:YES]; [array release];*/ Person *person = [[Person alloc]init]; person.name = name.text; person.gender = gender.text; person.age = age.text; person.education = education.text; NSMutableData *data = [[NSMutableData alloc]init]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; [archiver encodeObject:person forKey:kDataKey]; [archiver finishEncoding]; [data writeToFile:[self dataFilePath] atomically:YES]; [person release]; [archiver release]; [data release];}- (void)viewDidUnload{ [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; self.name = nil; self.gender = nil; self.age = nil; self.education = nil;}-(void)dealloc{ [name release]; [gender release]; [age release]; [education release];}- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated];}- (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated];}- (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];}- (void)viewDidDisappear:(BOOL)animated{[super viewDidDisappear:animated];}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ // Return YES for supported orientations return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);}@end4、通过iPhone开发【二十】数据持久化总结之第1篇NSUserDefaults 可以知道保存数据archive文件的存储位置是:
/Users/duobianxing/Library/Application Support/iPhone Simulator/5.0/Applications/F694104D-894D-4230-A01B-C62066B3DEC8/Documents
5、总结:
与属性列表相比,归档可以写入复杂的对象(Person类的实例)。
需要源码的网友请留言哦