IOS-数据存储之NSkeyedArchiver用法

Archiver简单用法:

1.用处很大. 但是用起来 比较麻烦.要从程序设计的时候就 把每一个类实现这个功能 .将内存中的 对象实例保存成 binary 到 磁盘 并且可以 逆向这个过程 用来保存 用户操作状态.

2.归档操作(NSkeyedArchiver),不同于其他数据存储,它可以把自定义对象存放在文件中。

对于一个应用来说,有唯一的沙盒与之对应,即每个应用不能跨沙盒操作文件。


代码示例:

需要注意的是,需要保存的对象类一定要引用NSCoding协议,并且实现

- (void)encodeWithCoder:(NSCoder *)aCoder

- (id)initWithCoder:(NSCoder *)aDecoder   


#pragma mark Demo_3
- (void)saveDataWithArchive{
    
    NSString *documentDirectoy = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ];
    //这里路径可以直接生成 test.archiver 文件,方便查看里面存储的内容暂且保存一个plist去archiver
    NSString *path = [documentDirectoy stringByAppendingPathComponent:@"test.plist"];
    NSLog(@"Archiver.path---%@",path);
    
    record *tempRecord = [[record alloc]init];
    tempRecord.aa = [NSNumber numberWithInt:10];
    tempRecord.bb = @"b10_test";
    tempRecord.cc = [NSNumber numberWithInt:100];
    tempRecord.dd = [NSNumber numberWithInt:1000];
    tempRecord.ee = @"e10_test";
    
    [NSKeyedArchiver archiveRootObject:tempRecord toFile:path];
    NSLog(@"Archiver 数据已存储.");
}

- (void)readDatafromArchive{
    NSString *documentDirectoy = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    //这里路径可以直接生成 test.archiver 文件,方便查看里面存储的内容暂且保存一个plist去archiver
    NSString *path = [documentDirectoy stringByAppendingPathComponent:@"test.plist"];
    
    record *tempRecord = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"aa=%@\n bb=%@\n cc=%@\n dd=%@\n ee=%@",tempRecord.aa,tempRecord.bb,tempRecord.cc,tempRecord.dd,tempRecord.ee);
    NSLog(@"Archiver 数据已取出");
}

自定义类:

//

#import "record.h"

@implementation record

#pragma mark - NSCodeing协议方法(一定要实现)
//当进行归档操作的时候就会调用该方法
//在该方法中要写清楚要存储对象的那些属性
- (void) encodeWithCoder:(NSCoder *)aCoder{
    NSLog(@"调用了encodeWithCoder方法");
    [aCoder encodeObject:_aa forKey:@"aaa"];
    [aCoder encodeObject:_bb forKey:@"bbb"];
    [aCoder encodeObject:_cc forKey:@"ccc"];
    [aCoder encodeObject:_dd forKey:@"ddd"];
    [aCoder encodeObject:_ee forKey:@"eee"];
    
}

//当进行解档操作的时候就会调用该方法
//在该方法中要写清楚要提取对象的哪些属性
- (id)initWithCoder:(NSCoder *)aDecoder{
    NSLog(@"调用了initWithCoder方法");
    if (self = [super init]) {
        self.aa = [aDecoder decodeObjectForKey:@"aaa"];
        self.bb = [aDecoder decodeObjectForKey:@"bbb"];
        self.cc = [aDecoder decodeObjectForKey:@"ccc"];
        self.dd = [aDecoder decodeObjectForKey:@"ddd"];
        self.ee = [aDecoder decodeObjectForKey:@"eee"];
    }
    return self;
}

@end



打印结果:


 

文件查看:



哈哈,其实也就这么简单!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章