zoukankan      html  css  js  c++  java
  • IOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种:

    1. 属性列表 (自定义的Property List 、NSUserDefaults)
    2. 归档 (NSKeyedArchiver)
    3. 数据库 (SQLite、Core Data、第三方类库等)

      下面主要来介绍一个归档NSKeyedArchiver

       归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上;程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象。

       归档方式:

    • 对Foundation框架中对象进行归档
    • 对自定义的内容进行归档
    • 对自定义的对象进行归档

    <一> 对Foundation框架中对象进行归档

    //获得文件路径
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"];
        
    //归档(序列化)
    NSArray *archiveAry = @[@"jereh",@"ios"];
    if ([NSKeyedArchiver archiveRootObject: archiveAry toFile:filePath]) {
            NSLog(@"Archiver  success");
    }
        
    //解归档(反序列化)
    NSArray *unArchiveAry = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@",unArchiveAry);

      小结:

    1. 归档和解归档操作步骤简单
    2. 一次只能归档一个对象,如果是多个对象归档需要分开进行
    3. 归档的对象是Foundation框架中的对象
    4. 归档和解归档其中任意对象都需要归档和解归档整个文件
    5. 归档后的文件是加密的,所以归档文件的扩展名可以随意取

    <二> 对自定义的内容进行归档

    //获得文件路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"];
        
    //1. 使用NSData存放归档数据
    NSMutableData *archiverData = [NSMutableData data];
    //2. 创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
    //3. 添加归档内容 (设置键值对)
     [archiver encodeObject:@"jereh" forKey:@"name"];
     [archiver encodeInt:20 forKey:@"age"];
     [archiver encodeObject:@[@"ios",@"oc"] forKey:@"language"];
    //4. 完成归档
     [archiver finishEncoding];
    //5. 将归档的信息存储到磁盘上
    if ([archiverData writeToFile:filePath atomically:YES]) {
         NSLog(@"archiver success");
    }
        
    //解归档
    //1. 从磁盘读取文件,生成NSData实例
    NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath];
    //2. 根据Data实例创建和初始化解归档对象
    NSKeyedUnarchiver *unachiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
    //3. 解归档,根据key值访问
    NSString *name = [unachiver decodeObjectForKey:@"name"];
    int age = [unachiver decodeIntForKey:@"age"];
    NSArray *ary = [unachiver decodeObjectForKey:@"language"];
    NSLog(@"name=%@ age=%i ary=%@",name,age,ary);

      小结:

    1. 在带键的归档中,每个归档字段都有一个key值,解归档时key值要与归档时key值匹配
    2. 带键归档可以一次存储多个对象
    3. 归档的对象是Foundation框架中的对象
    4. 归档和解归档其中任意对象都需要归档和解归档整个文件
    5. 归档后的文件是加密的,所以归档文件的扩展名可以随意取

    <三> 对自定义的对象进行归档

    #define IDNUM @"idNum"
    #define NAME @"name"
    
    @interface Student : NSObject <NSCoding>
    @property (nonatomic, assign) int idNum;
    @property (nonatomic, copy) NSString *name;
    @end
    
    @implementation Student
    
    #pragma mark 编码 对对象属性进行编码的处理
    - (void)encodeWithCoder:(NSCoder *)aCoder
    {
        [aCoder encodeInt:_idNum forKey:IDNUM];
        [aCoder encodeObject:_name forKey:NAME];
    }
    
    #pragma mark 解码 解码归档数据来初始化对象
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        if (self = [super init]) {
            _idNum = [aDecoder decodeIntForKey:IDNUM];
            _name = [aDecoder decodeObjectForKey:NAME];
        }
        return self;
    }
    @end

      小结:

    1. 自定义对象与自定义内容归档和解归档步骤和用法完全相同
    2. 自定义的对象归档需要实现NSCoding协议,并且实现协议中的方法
    3. NSCoding协议中有两个方法:
      •   encodeWithCoder方法对对象属性进行编码,在对象归档时调用
      •   initWithCoder方法解码归档数据来初始化对象,在对象解归档时调用

     

      总结:

    1. 归档和解归档可以用于少量数据的持久化存储和读取
    2. 属性列表只能存储Foundation框架中的对象,归档除了可以归档Foundation框架中的对象以外,还可以归档实现了NSCoding协议的自定义对象
    3. 通过归档创建的文件是加密的
    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
  • 相关阅读:
    permission 文档 翻译 运行时权限
    TabLayout ViewPager Fragment 简介 案例 MD
    Log 日志工具类 保存到文件 MD
    OkHttp 官方wiki 翻译 MD
    Okhttp 简介 示例 MD
    OkHttp 官方Wiki之【使用案例】
    DialogPlus
    倒计时 总结 Timer Handler CountDownTimer RxJava MD
    RecyclerView 判断滑到底部 顶部 预加载 更多 分页 MD
    CSS3的媒体查询(Media Queries)与移动设备显示尺寸大全
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4346205.html
Copyright © 2011-2022 走看看