美文网首页
OC 数据归档

OC 数据归档

作者: Maj_sunshine | 来源:发表于2017-04-19 17:18 被阅读114次

数据归档作为一种轻量级的数据存储方式,和属性列表不同之处在于存储的对象广泛,几乎任何类型的对象都能被归档存储且存储是进行加密处理的,归档时会转换和二进制数据,安全性远远高于属性列表。而属性列表只能存储oc基本数据类型和NSArray NSDictionary NSData NSDate NSString 类型。

使用archiveRootObject 对一个对象进行简单的归档。

 - (void)archiverOne
{
    // 获取归档文件的路径
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"my.archiver"];
    NSLog(@"filePath=%@",filePath);
    // 一个对象的归档方法  返回值为bool类型
    //    BOOL isSuccess = [NSKeyedArchiver archiveRootObject:<#(nonnull id)#> toFile:<#(nonnull NSString *)#>]
    BOOL isSuccess = [NSKeyedArchiver archiveRootObject:@"一个对象归档" toFile:filePath];
    if (isSuccess) {
        NSLog(@"归档成功");
    }
}

使用NSKeyedUnarchiver的unarchiveObjectWithFile方法解档

- (void)unArchiverOne
{
    //获取解档文件路径
    NSString *filepath1 = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"my.archiver"];
    //使用 NSKeyedUnarchiver 进行解档
    [NSKeyedUnarchiver unarchiveObjectWithFile:filepath1];
}

往往我们不只是要保存一个对象,这时候就要多个对象进行归档解档

使用NSKeyedArchiver alloc方法中的initForWritingWithMutableData对多个对象进行归档

- (void)archiverMore // 对多个对象进行归档
{
    //获取归档路径
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"demo.archiver"];
    //初始化一个可变二进制对象  NSMutableData
    NSMutableData *data = [NSMutableData data];
    //初始化归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    //对存储的数据进行编码
    [archiver encodeObject:@"summer" forKey:@"season"];
    [archiver encodeInteger:1 forKey:@"count"];
    [archiver encodeObject:[NSArray arrayWithObjects:@"张三",@"李四",@"王五", nil] forKey:@"name"];
    //编码结束 将数据写入二进制对象
    [archiver finishEncoding];
    //将二进制对象存储到文件中
    BOOL isSuccess = [data writeToFile:filePath atomically:YES];
    if (isSuccess) {
        NSLog(@"归档成功 ,path= %@",filePath);
    }
}

使用NSKeyedArchiver alloc方法中的initForReadingWithData对多个对象进行解档

- (void)unArchiverMore  // 对多个对象进行解档
{
    //获取解档档路径
    NSString *filepath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"demo.archiver"];
    //初始化文件中可变二进制对象
    NSMutableData *data = [NSMutableData dataWithContentsOfFile:filepath];
    //初始化解档对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
    //接收对应数据
    NSString *season = [unarchiver decodeObjectForKey:@"season"];
    NSInteger count = [unarchiver decodeIntegerForKey:@"count"];
    NSArray *name = [unarchiver decodeObjectForKey:@"name"];
    NSLog(@"secson = %@,count = %li,name = %@",season,count,name);
}

再有时候,系统的对象不能满足要求,当对象是服务器端传来的json数据解析而来的model时,以上两种都不能保存,这时候就要求自定义对象遵循NSCoding协议,我们实现协议后进行归档解档

model.h
#import <Foundation/Foundation.h>

@interface model : NSObject <NSCoding> // 保存自定义对象需遵循NSCoding协议并实现
@property(nonatomic,copy)NSString *season ;
@property(nonatomic,copy)NSArray *name;
@property(nonatomic,assign)NSInteger count;
@end
model.m
#import "model.h"

@implementation model
- (void)encodeWithCoder:(NSCoder *)aCoder //归档保存到文件中的时候调用方法,以下归档三个对象
{
   [aCoder encodeInteger:self.count forKey:@"count"];
   [aCoder encodeObject:self.season forKey:@"season"];
   [aCoder encodeObject:self.name forKey:@"name"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder //解档从文件中读取的时候调用方法
{
   if (self = [super init]) {
       self.name = [aDecoder decodeObjectForKey:@"name"];
       self.season =[aDecoder decodeObjectForKey:@"season"];
       self.count = [aDecoder decodeIntegerForKey:@"count"];
   }
   return self;
}
@end
遵循协议后用之前的方法进行归档解档
- (void)customArchiver  //自定义对象归档
{
    model *myModel = [[model alloc]init];
    myModel.name = @[@"1",@"2"];
    myModel.count = 10;
    myModel.season = @"summer";
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"custom.archiver"];
    NSLog(@"filePath=%@",filePath);
    BOOL isSuccess = [NSKeyedArchiver archiveRootObject:@"一个对象归档" toFile:filePath];
    if (isSuccess) {
        NSLog(@"归档成功");
    }
}
- (void)customUnArchiver
{
    NSString *filepath1 = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"custom.archiver"];
    //使用 NSKeyedUnarchiver 进行解档
   model *myModel= [NSKeyedUnarchiver unarchiveObjectWithFile:filepath1];
    if (myModel) {
        NSLog(@"%@,%li,%@", myModel.name, myModel.count, myModel.season);
    }
}

菜鸟学习第一天

相关文章

  • OC 数据归档

    数据归档作为一种轻量级的数据存储方式,和属性列表不同之处在于存储的对象广泛,几乎任何类型的对象都能被归档存储且存储...

  • 归档和解归档

    基本数据持久化:把OC中的基本数据存储到沙盒中。归档:把复杂类型转为data类型的过程。解归档:把data类型转为...

  • OC 归档

    在 Objective-C 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象. NS...

  • OC归档

    archive:归档主要是把对象 存 磁盘对象包括 系统对象 如 NSString NSArray NSDicti...

  • iOS-归档NSCoding序列化

    归档 归档->数据持久化的方式->加密(把文件加密《不是把数据加密》 归档分为: 1、存储数据(编码、序列化、归档...

  • iOS 数据持久化

    1,归档:单个对象的归档代码: 多个对象归档代码: 数据模型归档方法 2,plist.plist数据结构: Mod...

  • rman备份

    一、数据库备份与RMAN备份的概念 1.数据库完全备份:按归档模式分为归档和非归档 归档模式 ...

  • 缓存之归档、反归档

    归档反归档是数据存储方式的一种。归档将复杂数据结构转换成NSData进行存储,反归档将NSData转成复杂数据结构...

  • OC中的归档解档

    oc中的归档就是把对象写到文件中. 首先模型必须遵守NSCoding协议,并且实现其中的方法 (归档):- (vo...

  • IOS:OC--归档与反归档

    1.新建类 “Person ”2.Person .h@interface Person : NSObject

网友评论

      本文标题:OC 数据归档

      本文链接:https://www.haomeiwen.com/subject/evsyattx.html