iphone 数据存储之属性和归档archive

     在IPHONE中有四种方式可以永久存储数据分别是属性列表、归档、SQLITE3、coredata。前两者、后二者操作的时候有些地方是相同的,以属 性列表和归档来说都会用writeToFile/URL:path atomically:flag 和initWithContentofFile/URL:path;两都都不能直接操作基本数据类型,不过前者不能操作自定义的类,而后者可以通过实现 NSCoding协议来达到目的。另外要说点的就是IPHONE每个应用都会有三个文件夹分别是documents、tmp、library分别称为存储 应用的数据,临时数据,数据库。我们要保存的数据会在documents中。由于时间关系抽空再把这个文字写完整些。

#import "dataprocessAppDelegate.h"

@implementation dataprocessAppDelegate

@synthesize window;

@synthesize dataArray;

-(NSString*)pathFileForProcess:(NSString *)pathName{

NSArray *directory=NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);

return [[directory objectAtIndex:0] stringByAppendingPathComponent:pathName];

}

z

-(void)writeDataToFile{

firstData = [[NSString alloc] initWithString:@"im first!"];

secondData = [[NSString alloc] initWithString:@"im secondData!"];

thirdData = [[NSString alloc] initWithString:@"im thirdData!"];

NSLog(@"write:\n first: %@ \nscond: %@ \nthird: %@", firstData, secondData, thirdData);

NSMutableArray *tmp = [[NSMutableArray alloc] init];

[tmp addObject:firstData];

[tmp addObject:secondData];

[tmp addObject:thirdData];

self.dataArray = tmp;

[tmp release];



[firstData release];[secondData release];[thirdData release];

BOOL bWrite = [dataArray writeToFile:[self pathFileForProcess:@"myTest.txt"] atomically:YES];

}//属性读

-(void)readDataFromFile{

if([[NSFileManager defaultManager] fileExistsAtPath:[self pathFileForProcess:@"myTest.txt"]]){

      NSMutableArray  *tmpRead = [[NSMutableArray alloc] initWithContentsOfFile:[self pathFileForProcess:@"myTest.txt"]];

  self.dataArray = tmpRead;

      [tmpRead release];



    firstData = [dataArray objectAtIndex:0];

    secondData = [dataArray objectAtIndex:1];

    thirdData = [dataArray objectAtIndex:2];



    NSLog(@"read:\n first: %@ \nscond: %@ \nthird: %@", firstData, secondData, thirdData);

return;

}

NSLog(@"PROCESS FIRLE DOESNT EXITS!");

}



#pragma mark -------object-------------

//归档写

-(void)processObjectWrite{

person *pObject= [[person alloc] init];

pObject.name = [[NSString alloc] initWithString:@"wenQiang"];

pObject.profession = [[NSString alloc] initWithString:@"project manager"];

//[pObject setAge:24 andMarry: NO];



//NSMutableArray *testData = [[NSMutableArray alloc] init];

NSMutableData *data=[[NSMutableData alloc] init];

NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

[archiver encodeObject:pObject forKey:@"kObject"];

[archiver finishEncoding];

Boolean bWrite = [data writeToFile:[self pathFileForProcess:@"object2.txt"] atomically:YES];

if(bWrite) NSLog(@"ok..."); else NSLog(@"write error!");

[archiver release];

//[pObject release];

}、、归档读

-(void)processObjectRead{

NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:[self pathFileForProcess:@"object2.txt"]];

NSLog(@"data %@..", data);



NSKeyedUnarchiver *unchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

person *tmp = [unchiver decodeObjectForKey:@"kObject"];

[unchiver finishDecoding];



NSLog(@"OBJECT: name: %@ profession: %@\nage: %@\n marry:%@", tmp.name, tmp.profession);

[unchiver release];

//[tmp release];



//实现

- (void)applicationDidFinishLaunching:(UIApplication *)application {    



    // Override point for customization after application launch

//[self writeDataToFile];

//[self readDataFromFile];



[self processObjectWrite];

[self processObjectRead];

    [window makeKeyAndVisible];

}





- (void)dealloc {

    [window release];

[dataArray release];

    [super dealloc];

}





@end

//以下是自定义的类

#pragma mark-----------------------class person----------------

#define       kName              @"keyName"

#define       kProfession @"keyProfession"

#define       kAge @"keyAge"

#define       kMarry @"keyMarry"



@implementation person

@synthesize name;

@synthesize profession;

#pragma mark---------------nscoding delegate 2 method---------

- (void)encodeWithCoder:(NSCoder *)aCoder{

[aCoder encodeObject:name forKey: kName];

[aCoder encodeObject:profession forKey: kProfession];

// [aCoder encodeObject:Age forKey: kAge];

// [aCoder encodeObject:marry forKey:kMarry];

}

- (id)initWithCoder:(NSCoder *)aDecoder{

if(self = [super init]){

self.name = [aDecoder decodeObjectForKey:kName];

self.profession = [aDecoder decodeObjectForKey:kProfession];

//Age = [aDecoder decodeObjectForKey:kAge];

// marry=[aDecoder decodeObjectForKey:kMarry];

}

return self;

}

#pragma mark ---------------NSCopying 1 method-------------

- (id)copyWithZone:(NSZone *)zone{

person *tmp = [[[self class] allocWithZone:zone] init];



tmp.name = [self.name copy];

tmp.profession = [self.profession copy];

return nil;

}



-(void)dealloc{

[name release];

[profession release];

[super dealloc];

}

//-(void)setAge:(NSInteger)age andMarry:(Boolean)b{

// Age = age;

// marry = b;

//}



@end



你可能感兴趣的:(iPhone)