1. 程式人生 > >iOS 資料持久化方式

iOS 資料持久化方式

  • 所謂歸檔:將複雜物件轉化為NSData型別資料(複雜-->歸檔-->NSData--->WriteToFile)
    注意:歸檔是將物件轉化為資料位元組,以檔案的形式儲存在磁碟上,
  • 所謂反歸檔:將NSData型別資料轉化為複雜物件(讀取檔案-->NSData-->反歸檔--->複雜物件)

    再說歸檔之前,先說下iOS的資料持久化方式:
    那麼問題來了,什麼是資料持久化?

    資料持久化(俠義的理解):僅僅指把域物件永久儲存到資料庫中,(廣義的理解):包括和資料庫相關的各種操作
    優點:
    1:資料持久化可以減少訪問資料庫資料的次數,增加應用程式執行的速度;
    2:程式碼重用性高,能夠完成大部分資料庫操作;
    3:低耦合,使持久化不依賴於底層資料庫和上層業務邏輯實現,更換資料庫時只需要修改配置檔案而不用修改程式碼

那麼iOS的資料化持久方式有哪些呢?

1:屬性列表(Plist檔案),NSUserDefault
2:歸檔(NSKeyedArchiver)
3:資料庫(SQlite,CoreData,FMDB(第三方))

今天重點說下歸檔和結檔的問題
歸檔的三種方式:

1:對foundation框架的物件進行歸檔
2:對自定義的物件進行歸檔
3:對自定義內容進行歸檔
注意:歸檔生成的檔案是加密的

下邊舉簡單的例子分別說下歸檔的三種方式

#pragma mark---對自定義物件進行歸檔反歸檔----
- (void)archive{
//先建立一個Person類
/*
 第一:複雜物件所屬的類一定要遵循NSCoding協議
 第二:實現協議中的方法
 - (void)encodeWithCoder:(NSCoder *)aCoder;
 - (instancetype)initWithCoder:(NSCoder *)aDecoder;
//歸檔(由叫序列化)的步驟
//對Person類物件進行歸檔時執行此方法.並對Person類中想要進行歸檔的所有屬性,進行序列化操作

- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeObject:_gender forKey:@"gender"];
    [aCoder encodeObject:_age forKey:@"age"];
}

//反歸檔(由叫反序列化)的步驟
//對Person類物件進行反歸檔時執行此方法.並對Person類中想要進行反歸檔的所有屬性,進行反序列化操作
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        _name = [aDecoder decodeObjectForKey:@"name"];
        _gender = [aDecoder decodeObjectForKey:@"gender"];
        _age = [aDecoder decodeObjectForKey:@"age"];
    }
        return self;

}

 */
person *per = [person new]; per.name = @"甲甲"; per.age = @"20"; per.gender = @"女"; //歸檔 //1:準備路徑 NSString *path = NSHomeDirectory(); path = [path stringByAppendingString:@"Singel.plist"]; //2:準備儲存資料物件(用可變陣列進行接收) NSMutableData *data = [NSMutableData new]; //3:建立歸檔物件
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; //4:開始歸檔 [archiver encodeObject:per forKey:@"person"]; //5:完成歸檔 [archiver finishEncoding]; //6:寫入檔案 BOOL result = [data writeToFile:path atomically:YES]; if (result) { NSLog(@"歸檔成功:%@",path); } //反歸檔 //1:獲取解檔路徑 NSData *MyData = [NSData dataWithContentsOfFile:path]; //2:建立反歸檔物件 NSKeyedUnarchiver *unarchiver= [[NSKeyedUnarchiver alloc]initForReadingWithData:MyData]; //3:反歸檔 person *aper = [person new]; aper = [unarchiver decodeObjectForKey:@"person"]; //4:結束歸檔 [unarchiver finishDecoding]; NSLog(@"%@",aper.name); }
#pragma mark----對foundation框架中的物件進行歸檔和反歸檔
- (void)fundationClass{
//歸檔
    //1:建立路徑
    NSString *Doucuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
    NSString *path = [Doucuments stringByAppendingString:@"file.plist"];
    //2:歸檔(不需要結束方法)
    NSArray *array = @[@"jiajia",@"jiejie",@"pangpang"];
    BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:path];
    if (result) {
        NSLog(@"框架中的歸檔%@",path);
    }
    //反歸檔
    NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"框架的結檔%@",newArray);
}
#pragma mark----對自定義的內容進行歸檔和反歸檔
- (void)customContent{
//歸檔
    //1:獲取路徑

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];

   path = [path stringByAppendingString:@"custom.plist"];

    NSMutableData *data = [NSMutableData data];

    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

    [archiver encodeObject:@"111" forKey:@"name"];
    [archiver encodeObject:@"2" forKey:@"gender"];
    [archiver encodeObject:@"100" forKey:@"age"];

    [archiver finishEncoding];

    BOOL result = [data writeToFile:path atomically:YES];
    if (result) {
        NSLog(@"歸檔%@",path);
    }
    NSData *newdata = [NSData dataWithContentsOfFile:path];
    NSKeyedUnarchiver *unkeyed =  [[NSKeyedUnarchiver alloc]initForReadingWithData:newdata];
//    NSString *str1 = [unkeyed decodeObjectForKey:@"name"];
//    NSString *str2 = [unkeyed decodeObjectForKey:@"gender"];
//    NSString *str3 = [unkeyed decodeObjectForKey:@"age"];

    person *pp = [person new];
    pp.name = [unkeyed decodeObjectForKey:@"name"];
    pp.gender = [unkeyed decodeObjectForKey:@"gender"];
    pp.age = [unkeyed decodeObjectForKey:@"age"];
    [unkeyed finishDecoding];
    NSLog(@"name:%@ gender:%@ age:%@",pp.name,pp.gender,pp.age);
//    NSLog(@"name:%@ gender:%@ age:%@",str1,str2,str3);

}



文/釺探穗(簡書作者)
原文連結:http://www.jianshu.com/p/df801df8169e
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

相關推薦

iOS 資料持久化方式

所謂歸檔:將複雜物件轉化為NSData型別資料(複雜-->歸檔-->NSData--->WriteToFile)注意:歸檔是將物件轉化為資料位元組,以檔案的形式儲存在磁碟上, 所謂反歸檔:將NSData型別資料轉化為複雜物件(讀取檔案-->NSDat

ios開發中的4種資料持久化方式

iOS中的永久儲存,也就是在關機重新啟動裝置,或者關閉應用時,不會丟失資料。在實際開發應用時,往往需要持久儲存資料的,這樣使用者才能在對應用進行操作後,再次啟動能看到自己更改的結果與痕跡。ios開發中,我們需要資料持久化這一種技術,也需要不斷在實際開發的工作與學習中完善資

三種資料持久化方式介紹(轉載)

通過專案,我們瞭解到EF框架有三種資料持久化的方式,也就是標題中我所提到的三種。那麼這些方式之間又有什麼聯絡和區別呢?     篇幅原因,本篇部落格不再分別介紹每種方法如何實現的了,大家用的時候可以去Sou~一下。       先分別介紹

iOS-資料持久化之Sqllite

iOS中的資料儲存方式 Plist(NSArray\NSDictionary) Preference(偏好設定\NSUserDefaults) NSCoding(NSKeyedArchiver\NSkeyedUnarchiver) SQLite3 Core Data

ios 資料持久化儲存

說到資料儲存,我們不得不先了解下蘋果的沙盒 、如何獲取沙盒路徑和沙盒目錄下對應的檔案: 一、沙盒(sandbox) 每一個App都有一個儲存空間。iOS系統為每個應用程式建立自己的目錄,每個應用程式只能訪問自己的目錄,不能相互通訊。 沙盒主要包括下面幾個檔案:用模擬器執行 NS

iOS 資料持久化 CoreData的版本遷移

一般程式app升級時,資料庫有可能發生改變,如增加表字段,增加表等。 此時有兩種操作: 第一種就是毫無留情的把本地舊資料庫直接刪掉,重新建立新的資料庫; 第二種就是資料庫遷移,更新資料庫。 第一種情況是簡單粗暴型,但不會保留任何歷史資料,一般不推薦使用。 這裡主要介紹第二

iOS 資料持久化 CoreData

            CoreData是iOS3.0後引入的資料持久化解決方案, 是一種物件關係對映(ORM), 例如java後臺中的Hibernate, iOS中ORM框架首先CoreDat

iOS資料持久化儲存:歸檔

在平時的iOS開發中,我們經常用到的資料持久化儲存方式大概主要有:NSUserDefaults(plist),檔案,資料庫,歸檔。。前三種比較經常用到,第四種歸檔我個人感覺用的還是比較少的,恰恰因為用的比較少,但是還是有地方要用到,所以今天再把歸檔解檔複習一遍吧。 一、什麼是歸檔:   物件歸檔是將物件以

iOS資料持久化的應用場景

iOS 開發中,一般有如下幾種資料儲存方式。需要根據具體的業務場景,選擇 合適的資料儲存方式。1.(1) 使用者預設設定 – 這種情況通常不需要使用者干預,如遊戲通關資訊,Video播放記錄,或者 App 退出之後,下次進入時,希望恢復到退出時的情況。2.(2) 設定束(S

iOS 資料持久化之使用NSUserDefaults儲存資料

iOS下可以使用NSUserDefaults、sqlite、CoreData幾種常用的方式來儲存資料,其中NSUserDefaults用來儲存類似使用者的配置等這些的資料,後兩者使用者儲存大批量和比較複雜的資料。NSUserDefault的使用比較簡單: NSUserDef

Android 資料持久化技術(即資料儲存方式

在討論資料持久化技術之前我們先了解幾個概念? 什麼是瞬時資料:儲存在記憶體當中,有可能會因為程式的關閉或其他原因導致記憶體被收回而丟失的資料。   為什麼採用資料持久化技術:為了保證關鍵資料在程式退出時不被丟失。   什麼是資料持久化技術:將記憶體中的瞬時資料

iOS開發簡記(8):資料持久化

資料持久化,也就是把資料儲存到磁碟,以後可以再讀取出來使用(也可以再次更改或刪除)。很多場景需要資料持久化,比如為了減輕伺服器的訪問與儲存壓力,客戶端需要在本地做一些資料持久化的工作。 iOS的資料持久化,有幾種方式,包括:自定義格式的檔案、plist、CoreData、FMDB等等。 這裡

ios應用資料儲存方式(偏好設定)-轉

一.簡單介紹 1.很多ios應用都支援偏好設定,比如儲存使用者名稱,密碼,字型大小等設定,ios提供了一套標準的解決方案來為應用加入偏好設定功能。 2.每個應用都有個NSUserDefaults例項,通過它來儲存偏好設定。比如,儲存使用者名稱,字型大小,是否自動登入。 3.儲存位

redis,mysql,memcache的區別與比較,redis兩種資料儲存持久化方式

redis與mysql比較 區別:mysql中一箇中小型的網路資料庫,比oracle和sqlserver小, 但是併發能力遠超過acess這樣的桌面資料庫;redis是一個記憶體鍵值資料庫,支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫

Redis資料型別與持久化方式

Redis是一個開源的記憶體儲存的資料結構資料庫,它可以作為資料庫,快取,訊息佇列。支援多種資料格式。和mc相比具有資料持久化的能力。並能通過哨兵和叢集提高可用性。 它具有以下資料型別:   字串型別 在Redis裡面採用的是SDS來封裝char[]的,這個也是redi

iOS中常用的四種資料持久化方法簡介

OS中的資料持久化方式,基本上有以下四種:屬性列表、物件歸檔、SQLite3和Core Data NSUserDefaults,用於儲存配置資訊 SQLite,用於儲存查詢需求較多的資料 CoreData,用於規劃應用中的物件 使用基本物件型別定製的個性化快取方案1.屬性列表 涉及到的主要類:NSUs

IOS的四種資料儲存方式及優劣

IOS有四種常用資料儲存方式: 第一種方法:用NSUserDefaults儲存配置資訊 NSUserDefaults被設計用來儲存裝置和應用的配置資訊,它通過一個工廠方法返回預設的、也是最常用到的例項物件。這個物件中儲存了系統中使用者的配置資訊,開發者可以通

iOS中 常用的資料持久化方法

對啊 就這麼簡單。 iOS中的資料持久化方式,基本上有以下四種:屬性列表、物件歸檔、SQLite3和Core Data 1.屬性列表 涉及到的主要類:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就夠用了@interface Us

redis的資料型別和持久化方式

redis是一種高階的key-value的儲存系統其中的key是字串型別其中value 支援五種資料型別:1)字串型 string2)字串列表 lists3)字串集合 sets4)有序字串集合 sorted sets5)雜湊型別 hashsRedis中的Hashes型別可以看

IOS --Object-C 四種儲存資料方式

在iOS開發過程中,不管是做什麼應用,都會碰到資料儲存的問題。將資料儲存到本地,能夠讓程式的執行更加流暢,不會出現讓人厭惡的菊花形狀,使得使用者體驗更好。下面介紹一下資料儲存的方式: 1.NSKeyedArchiver:採用歸檔的形式來儲存資料,該資料物件需要遵守NSCoding協議,並且