OCデータアーカイブ

5135 ワード

データアーカイブは軽量レベルのデータストレージ方式として、属性リストとは異なる点は、格納されているオブジェクトが広く、ほとんどのタイプのオブジェクトがアーカイブされ、暗号化処理されて格納されていることであり、アーカイブ時に変換やバイナリデータが変換され、属性リストよりはるかに安全性が高いことである.属性リストには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: toFile:]
    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のオブジェクトである場合、以上の2つは保存できません.この場合、カスタムオブジェクトはNSCodingプロトコルに従う必要があります.プロトコルを実現した後、アーカイブアーカイブを行います.
model.h
#import 

@interface model : NSObject  //  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);
    }
}

菜鳥学習初日