iOS開發(fā)基礎-數據存儲方式(歸檔)

** 前言:**
歸檔是iOS開發(fā)中數據存儲常用的技巧,歸檔可以直接將對象儲存成文件潜慎,把文件讀取成對象。相對于plist或者userdefault形式,歸檔可以存儲的數據類型更加多樣豌拙,并且可以存取自定義對象。對象歸檔的文件是保密的鳖链,在磁盤上無法查看文件中的內容姆蘸,更加安全墩莫。

一芙委、系統(tǒng)對象的歸檔

兩個核心方法
\+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;
\+ (nullable id)unarchiveObjectWithFile:(NSString *)path;

使用NSKeyedArichiver進行歸檔、NSKeyedUnarchiver進行接檔狂秦,這種方式會在寫入灌侣、讀出數據之前對數據進行序列化、反序列化操作裂问。

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                     @"xiaoming", @"name",
                     @15, @"age",
                     @"1234567", @"studentid",
                     @"boy", @"sex",nil];
NSArray *array = @[@"數據1",@"數據2",@"數據3",@"數據4"];

NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];

NSString *path1 =[docPath stringByAppendingPathComponent:@"person.archiver"];//后綴名可以隨意命名
NSString *path2 =[docPath stringByAppendingPathComponent:@"data.archiver"];

BOOL flag1 = [NSKeyedArchiver archiveRootObject:array toFile:path1];
BOOL flag2 = [NSKeyedArchiver archiveRootObject:dic toFile:path2];

這種方式可以對基本數據類型進行歸檔侧啼,比如字符串,NSNumber堪簿,當然常用的是對NSArray與NSDictionary進行歸檔痊乾。返回值Flag標志著是否歸檔成功,YES為成功椭更,NO為失敗哪审。

解檔:

NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithFile:path1];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path2];

二、對多種類型數據進行歸檔

同樣是使用NSKeyedArchiver進行歸檔虑瀑,不同的是同時歸檔多個數據湿滓,這里我們舉例放入了一個CGPoint點、字符串舌狗、整數(當然很多類型都可以的叽奥,例如UIImage、float等等)痛侍,使用encodeXXX方法進行歸檔朝氓,最后通過writeToFile方法寫入文件。
歸檔:寫入數據

// NSKeyedArchiver 可以對多種類型數據進行歸檔
CGPoint point = CGPointMake(10, 20);
NSString *name = @"xiaoMing";
NSInteger age = 10;

NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [docPath stringByAppendingPathComponent:@"multiData.arch"];

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archvier = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

// 對多種類型數據歸檔
[archvier encodeCGPoint:point forKey:@"point"];
[archvier encodeObject:name forKey:@"name"];
[archvier encodeInteger:age forKey:@"age"];
[archvier finishEncoding];
[data writeToFile:path atomically:YES];

解檔:從路徑中獲得數據構造NSKeyedUnarchiver實例,使用decodeXXXForKey方法獲得文件中的對象赵哲。

NSMutableData *dataR = [[NSMutableData alloc] initWithContentsOfFile:path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:dataR];
CGPoint pointR = [unarchiver decodeCGPointForKey:@"point"];
NSString *nameR = [unarchiver decodeObjectForKey:@"name"];
NSInteger ageR = [unarchiver decodeIntegerForKey:@"age"];
[unarchiver finishDecoding];
NSLog(@"%f,%f,%@,%d",pointR.x,pointR.y,nameR,ageR);

三嘹狞、對自定義對象進行歸檔

除了字典和數組,開發(fā)中往往需要自定義一些對象誓竿,也就是MVC中的model層磅网。
那么如何對自定義對象進行存取就顯得重要的多,歸檔是個不錯的好選擇筷屡。

我們有個自定義對象叫做 person涧偷。
person.h

#import <Foundation/Foundation.h>

// 歸檔自定義對象該對象必須實現nscoding 協議
@interface person : NSObject<NSCoding>

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,assign) double height;

@end

person.m 需要重寫兩個協議方法

-(void)encodeWithCoder:(NSCoder *)aCoder方法:
-(id)initWithCoder:(NSCoder *)aDecoder方法:

#import "person.h"

@implementation person

// 當將一個自定義對象保存到文件的時候就會調用該方法
// 在該方法中說明如何存儲自定義對象的屬性
// 也就說在該方法中說清楚存儲自定義對象的哪些屬性
-(void)encodeWithCoder:(NSCoder *)aCoder
{
         NSLog(@"調用了encodeWithCoder:方法");
         [aCoder encodeObject:self.name forKey:@"name"];
         [aCoder encodeInteger:self.age forKey:@"age"];
         [aCoder encodeDouble:self.height forKey:@"height"];
}

// 當從文件中讀取一個對象的時候就會調用該方法
// 在該方法中說明如何讀取保存在文件中的對象
// 也就是說在該方法中說清楚怎么讀取文件中的對象
-(id)initWithCoder:(NSCoder *)aDecoder
{
     NSLog(@"調用了initWithCoder:方法");
     //注意:在構造方法中需要先初始化父類的方法
     if (self=[super init]) {
             self.name=[aDecoder decodeObjectForKey:@"name"];
             self.age=[aDecoder decodeIntegerForKey:@"age"];
             self.height=[aDecoder decodeDoubleForKey:@"height"];
         }
     return self;
 }

@end

對person對象進行歸檔解檔:

- (IBAction)archiveSelfObject:(id)sender {

    person *xiaoMu = [[person alloc] init];
    xiaoMu.name = @"小木";
    xiaoMu.age = 25;
    xiaoMu.height = 180;
    // 獲取文件路徑
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docPath stringByAppendingPathComponent:@"person.arch"];
    // 保存自定義對象
    [NSKeyedArchiver archiveRootObject:xiaoMu toFile:path];
    
    // 解檔
    person *person2 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"%@,%d,%.1fcm",person2.name,person2.age,person2.height);
}

返回結果:


控制臺日志

** 相關 **
iOS 沙盒目錄結構及正確使用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市毙死,隨后出現的幾起案子燎潮,更是在濱河造成了極大的恐慌,老刑警劉巖扼倘,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件确封,死亡現場離奇詭異,居然都是意外死亡再菊,警方通過查閱死者的電腦和手機爪喘,發(fā)現死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纠拔,“玉大人秉剑,你說我怎么就攤上這事〕砘澹” “怎么了侦鹏?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長臀叙。 經常有香客問我略水,道長,這世上最難降的妖魔是什么劝萤? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任渊涝,我火速辦了婚禮,結果婚禮上稳其,老公的妹妹穿的比我還像新娘驶赏。我一直安慰自己,他們只是感情好既鞠,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布详拙。 她就那樣靜靜地躺著链方,像睡著了一般废士。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上五续,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音龄恋,去河邊找鬼疙驾。 笑死,一個胖子當著我的面吹牛郭毕,可吹牛的內容都是我干的它碎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼显押,長吁一口氣:“原來是場噩夢啊……” “哼扳肛!你這毒婦竟也來了?” 一聲冷哼從身側響起乘碑,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挖息,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兽肤,有當地人在樹林里發(fā)現了一具尸體套腹,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年资铡,在試婚紗的時候發(fā)現自己被綠了电禀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡害驹,死狀恐怖鞭呕,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情宛官,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布瓦糕,位于F島的核電站底洗,受9級特大地震影響,放射性物質發(fā)生泄漏咕娄。R本人自食惡果不足惜亥揖,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望圣勒。 院中可真熱鬧费变,春花似錦、人聲如沸圣贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吁峻。三九已至滑负,卻和暖如春在张,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矮慕。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工帮匾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痴鳄。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓瘟斜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痪寻。 傳聞我的和親對象是個殘疾皇子哼转,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容