OCデータアーカイブ
5135 ワード
データアーカイブは軽量レベルのデータストレージ方式として、属性リストとは異なる点は、格納されているオブジェクトが広く、ほとんどのタイプのオブジェクトがアーカイブされ、暗号化処理されて格納されていることであり、アーカイブ時に変換やバイナリデータが変換され、属性リストよりはるかに安全性が高いことである.属性リストにはoc基本データ型とNSArray NSDictionary NSData NSDate NSString型しか格納できません.
オブジェクトを保存するだけでなく、複数のオブジェクトをアーカイブしてアーカイブ解除することがよくあります.
また、システムのオブジェクトが要求を満たすことができず、サーバ側から送られてきたjsonデータ解析によるmodelのオブジェクトである場合、以上の2つは保存できません.この場合、カスタムオブジェクトはNSCodingプロトコルに従う必要があります.プロトコルを実現した後、アーカイブアーカイブを行います.
model.h
model.m
プロトコルに従って以前の方法でアーカイブ解除
菜鳥学習初日
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);
}
}
菜鳥学習初日