iOS开发 数据存储之NSKeyedArchiver

NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码

1.先定义一个Person类

Person.h文件中

@interface Person : NSObject<NSCoding>

@property (nonatomic, assign) NSInteger pId;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) NSString *sex;
@property (nonatomic, assign) CGFloat height;
/**保存路径*/
+ (NSString *)personPath;
@end

Person.m文件中

// 当将一个自定义对象保存到文件的时候就会调用该方法
// 在该方法中说明如何存储自定义对象的属性
// 也就说在该方法中说清楚存储自定义对象的哪些属性
/**协议方法-对数据进行序列化*/
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:@(self.pId) forKey:@"person_id"];
    [aCoder encodeObject:self.name forKey:@"person_name"];
    [aCoder encodeObject:@(self.age) forKey:@"person_age"];
    [aCoder encodeObject:self.sex forKey:@"person_sex"];
    [aCoder encodeObject:@(self.height) forKey:@"person_height"];
}
// 当从文件中读取一个对象的时候就会调用该方法
// 在该方法中说明如何读取保存在文件中的对象
// 也就是说在该方法中说清楚怎么读取文件中的对象
/**协议方法-对数据进行反序列化并读取*/
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.pId = [[aDecoder decodeObjectForKey:@"person_id"] integerValue];
        self.name = [aDecoder decodeObjectForKey:@"person_name"];
        self.age = [[aDecoder decodeObjectForKey:@"person_age"] integerValue];
        self.sex = [aDecoder decodeObjectForKey:@"person_sex"];
        self.height = [[aDecoder decodeObjectForKey:@"person_height"] floatValue];
    }
    return self;
}
#pragma mark - 保存路劲
+ (NSString *)personPath
{
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docPath stringByAppendingPathComponent:@"person"];
    return path;
}

2.归档操作:

如果对Person对象归档保存,只需要调用NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile:即可

// 先定义Person对象
Person *person = [[Person alloc] init];
person.pId = 1;
person.name = @"Jack";
person.age = 23;
person.sex = @"男";
person.height = 187.0;
// 保存路劲
NSString *path = [Person personPath];
[NSKeyedArchiver archiveRootObject:person toFile:path];

3.解压操作:

如果对Person对象解压操作,只需要调用NSCoder子类NSKeyedUnarchiver的方法unarchiveRootObject:toFile:即可

NSString *path = [Person personPath]; // 根据路劲解压数据
[NSKeyedUnarchiver unarchiveObjectWithFile:path];

4.删除数据:

NSString *path = [Person personPath]; // 根据路劲删除数据
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];

5.特点:

1)易用性较强

2)数据存储archive文件中

3)一般用于存储少量数据

6.缺点:

归档的形式来保存数据,只能一次性归档保存以及一次性解压.所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值