MyException - 我的异常网
当前位置:我的异常网» Iphone » iPhone开发数据持久化小结之第3篇—归档(NSKeyedAr

iPhone开发数据持久化小结之第3篇—归档(NSKeyedArchiver、NSKeyedUnarchiver)

www.MyException.Cn  网友分享于:2013-02-20  浏览:13次
iPhone开发数据持久化总结之第3篇—归档(NSKeyedArchiver、NSKeyedUnarchiver) .
实现的功能:1)演示使用归档持久化数据。

关键词:数据持久化 归档  NSKeyedArchiver NSKeyedUnarchiver

1、将上一篇iPhone开发数据持久化总结之第2篇属性文件(.plist)的工程拷贝一份,名称修改为Persistence-archiver,工程结构如下:
[img]

[/img]



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;
@end




Person.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;
}

@end





3、接下来主要修改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);
}

@end







4、通过iPhone开发【二十】数据持久化总结之第1篇NSUserDefaults 可以知道保存数据archive文件的存储位置是:
/Users/duobianxing/Library/Application Support/iPhone Simulator/5.0/Applications/F694104D-894D-4230-A01B-C62066B3DEC8/Documents




5、总结:

与属性列表相比,归档可以写入复杂的对象(Person类的实例)。



文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有