数据解档和归档

                                      数据解档和归档

 

"一,对一个对象进行归档-解档(字符串,数字,字典,数组)

 

//1.获取文件路径

NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

 

//2、添加储存的文件名

NSString *path  = [docPath stringByAppendingPathComponent:@"data.archiver"];

 

//3、将一个对象保存到文件中

BOOL flag = [NSKeyedArchiver archiveRootObject:@"name" toFile:path];

 

//1.获取文件路径

NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

 

NSString *path=[docPath stringByAppendingPathComponent:@"data.archiver"];

NSLog(@"path=%@",path);

 

//2.从文件中读取对象

[NSKeyedUnarchiver unarchiveObjectWithFile:path]

 

 

"二,对多个对象进行归档-解档

 

//准备数据

    CGPoint point = CGPointMake(1.0, 2.0);

    NSString *origin = @"坐标原点";

    NSInteger value = 10;

    NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSString *path = [docPath stringByAppendingPathComponent:@"multi.archiver"];

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

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

 

//对多个对象进行归档

    [archvier encodeCGPoint:point forKey:@"kPoint"];

    [archvier encodeObject: origin forKey:@"kOrigin"];

    [archvier encodeInteger:value forKey:@"kValue"];

    [archvier finishEncoding];

    [data writeToFile:path atomically:YES];

 

 

    NSMutableData *dataR = [[NSMutableData alloc] initWithContentsOfFile:multiHomePath];

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:dateR];

    CGPoint pointR = [unarchiver decodeCGPointForKey:@"kPoint"];

    NSString *infoR = [unarchiver decodeObjectForKey:@"kInfo"];

    NSInteger valueR = [unarchiver decodeIntegerForKey:@"kValue"];

    [unarchiver finishDecoding];

    NSLog(@"%f,%f,%@,%d",pointR.x,pointR.y,infoR,valueR);

 

"三,对自定义对象进行归档-解档

 

   1.首先需要实现在类中实现两个方法

    //归档只是一个过程  告诉系统 你到底保存对象的 哪些属性

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

        

        [aCoder encodeObject:_name forKey:@"name"];

        [aCoder encodeInteger:_age forKey:@"age"];

    }

 

    //解档只是一个过程 告诉系统 你到底 想取出 该对象的 哪些属性

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

        

        if(self = [super init]){

            

            _name = [aDecoder decodeObjectForKey:@"name"];

        }

        return self;

    }

 

 

 

    HMPig *pig = [[HMPig alloc] init];

    pig.name = @"小花";

    pig.age = 18;

 

    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.plist"];

    //归档

    [NSKeyedArchiver archiveRootObject:pig toFile:filePath];

 

    //取数据

    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.plist"];

 

    //反归档 解档

    HMPig *pig =  [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

 

 

 

 

/*

注意

 

    如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。即 [super encodeWithCoder:aCoder] [super initWithCoder:aDecoder] 方法;

 

    必须遵循并实现NSCoding协议

 

    归档和解归档其中任意对象都需要归档和解归档整个文件

 

    归档后的文件是加密的,保存文件的扩展名可以任意指定

 

 

 

 

 

posted @ 2017-03-08 19:09  futher_superMan  阅读(224)  评论(0)    收藏  举报