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];
        }

 

缺點:歸檔的形式來保存數據,只能一次性歸檔保存以及一次性解壓。所以只能針對小量數據,而且對數據操作比較笨拙,即如果想改動數據的某一小部分,還是需要解壓整個數據或者歸檔整個數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM