• IOS数据存储之归档/解档


    前言:

         前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchiver)。我们先来回顾一下JAVA是怎么实现保存一个自定义对象的!首先一个自定义对象必须实现Serializable接口,然后把一个对象序列化成二进制数据写入一个byte[]数据或者文件,反之则是从一个二进制数据或者文件中读取二进制数据反序列化成对象,所以我认为ios的归档解档其实就是类似JAVA序列化反序列化的过程,下面写个程序来尝试一下。

    先测试下基础类型:

     //归档
        NSString *Path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
        //字符串数据
        NSString * string =@"who is lcj?";
        NSString *filename = [Path stringByAppendingPathComponent:@"testString"];
        [NSKeyedArchiver archiveRootObject:string toFile:filename];
        NSString *string1=[NSKeyedUnarchiver unarchiveObjectWithFile:filename];
        NSLog(@"testString---%@",string1);
    
        //集合数组
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@"who", @"islcj", nil];
        filename = [Path stringByAppendingPathComponent:@"testArray"];
        [NSKeyedArchiver archiveRootObject:array toFile:filename];
        NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];
        NSLog(@"testArray---%@",arr);
        
        //字典保存
        filename = [Path stringByAppendingPathComponent:@"testNSDictionary"];
        NSDictionary *dictionary=[NSDictionary dictionaryWithObject:@"whoislcj" forKey:@"name"];
        [NSKeyedArchiver archiveRootObject:dictionary toFile:filename];
        NSDictionary *dictionary1=[NSKeyedUnarchiver unarchiveObjectWithFile: filename];
        NSLog(@"dictionary---%@",dictionary1);
        

    上面已经说了JAVA要想实现序列化反序列化必须实现Serializable接口,那么iOS呢?iOS需要实现NSCoding协议,

    Person.h

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject<NSCoding>
    
    @property (nonatomic,strong)NSString *name;
    
    @end

    Person.m

    #import "Person.h"
    
    @implementation Person
    
    #pragma mark - NSCoding Delegate
    
    -(id)init{
        if(self==nil){
            self =[super init];
        }
        return self;
    }
    
    - (void)encodeWithCoder:(NSCoder *)aCoder {
        [aCoder encodeObject:self.name forKey:@"name"];
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super init];
        if (self)
        {
            self.name = [aDecoder decodeObjectForKey:@"name"];
        }
        return self;
    }
    
    @end

    具体实现:

        //自定义对象类型
        Person *person=[[Person alloc]init];
        person.name=@"whoislcj";
        filename = [Path stringByAppendingPathComponent:@"testObject"];
        [NSKeyedArchiver archiveRootObject:person toFile:filename];
        Person *tempPerson = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];
        NSLog(@"tempPerson:%@",tempPerson.name);

    归档如何删除

          //删除归档文件
            NSFileManager *defaultManager = [NSFileManager defaultManager];
            if ([defaultManager isDeletableFileAtPath:filename]) {
                [defaultManager removeItemAtPath:filename error:nil];
            }

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

  • 相关阅读:
    phpquery中文手册
    Fiddler工具使用介绍一
    Xshell出现要继续使用此程序必须应用到最新的更新或使用新版本
    PHP Ajax 跨域问题最佳解决方案
    charles和Fiddler感觉哪个更好用
    趣味小应用:用HTML5消磨时光 狼人:
    开发人员必知的20+HTML5技巧 狼人:
    云计算时代:LAMP何去何从? 狼人:
    Adobe改善Flash隐私功能 狼人:
    LAMP网站架构方案分析 狼人:
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5481123.html
Copyright © 2020-2023  润新知