iOS-數據持久化-整合篇

前言:

在程序開發中,數據層永遠是程序的核心結構之一。對這些數據的加工處理是代碼中能體現技術水平的一大模塊,比如數據的請求、解析、緩存、持久化等等。適當的對數據進行持久化存儲可以實現應用的離線功能,以此提高用戶體驗。

一、簡介

1.數據持久化方式(四種):
- 屬性列表------->(plist)
- 數據歸檔 ------>(NSKeyedValueArchiver/NSUserDefaults)
- 數據庫--------->(sqlite)
- coreData

2.區別:
  • 1.屬性列表-plist
    簡介:
    1.屬性列表是一種XML格式的文件,拓展名為plist
    2.plist只能用數組(NSArray)或者字典(NSDictionary)進行讀取,由于屬性列表本身不加密,所以安全性幾乎可以說為零。
    3.屬性列表正常用于存儲少量的并且不重要的數據。
    4.如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型就可以使用
    5.writeToFile:atomically: 方法直接將對象寫到屬性列表文件中
    ---
    優點:像字典一樣的賦值方式方便簡單
    缺點: 無法存儲自定義的數據、不加密安全性低
  • 2.數據歸檔-NSKeyedArchiver/序列化
    1.數據歸檔是進行加密處理的,數據在經過歸檔處理會轉換成二進制數據,所以安全性要遠遠高于屬性列表。
    2.使用歸檔方式,我們可以將復雜的對象寫入文件中,并且不管添加多少對象,將對象寫入磁盤的方式都是一樣的。
    3.使用NSKeyedArchiver對自定義的數據進行序列化,并且保存在沙盒目錄下。
    *(注意:1.使用這種歸檔的前提是讓存儲的數據模型遵守NSCoding協議并且實現其兩個協議方法。
    2.當然,如果為了更加安全的存儲,也可以遵守NSSecureCoding協議,這是iOS6之后新增的特性)
  • 3.數據庫
    簡介:
    1.sqlite是一個輕量級、跨平臺的小型數據庫
    2.擁有可移植性高、有著和MySql幾乎相同的數據庫語句
    3.無需服務器即可使用
    ---
    優點:
    1.可以存儲大量的數據,存儲和檢索的速度非常快
    2.能對數據進行大量的聚合,這樣比起使用對象來進行這些操作要快。
    缺點:
    1.它沒有提供數據庫的創建方式;
    2.它基于C語言框架設計,沒有面向對象的API,所以使用起來比較麻煩;
    3.復雜的數據模型的數據建表相對而言比較麻煩。
    ---
    注:當然,我們也可以使用基于sqlite封裝的開源數據庫FMDB來減少使用sqlite的工作量
  • 4.coreData
    簡介:
    1.coreData是蘋果官方iOS5之后推出的綜合型數據庫,其使用了ORM(Object Relational Mapping)對象關系映射技術,將對象轉換成數據,存儲在本地數據庫中。
    2.coreData為了提高效率,甚至將數據存儲在不同的數據庫中,且在使用的時候將本地數據放到內存中使得訪問速度更快。
    3.我們可以選擇coreData的數據存儲方式,包括sqlite、xml等格式。
    4.但也正是coreData 是完全面向對象的,其在執行效率上比不上原生的數據庫。
    5.除此之外,coreData擁有數據驗證、undo等其他功能,在功能上是四種持久化方案最多的。
二、基本用法--(歸檔、解檔)
  • 1.屬性列表--plist
  應用場景:
      最近在實現公司項目業務的時候,需要使用選擇器(UIPickerView)給用戶選擇所在城市。對于城市數據,并沒有加密的必要,
   而且這時候使用plist會達到更高一些的效率。既然已經知道需要的數據,那么很容易就得得出省-市這樣的一對多的數據類型,
   我們的plist使用字典,將省份作為key,存儲對應的城市的數組作為value。
  補充:
       實現選擇器的大概思路是用兩個數組分別存儲省份以及當前選中省份的城市數組,
    然后在滑動pickerView的回調事件中根據選中的省份更新城市數據源。
   ---            
  #注意:詳細過程請參考-參考網站所示。
  • 2.NSUserDefault--偏好設置Preference
   簡介:
       1. 支持的數據格式有:NSNumber(Integer、Float、Double等)、NSString、NSDate、NSArray(成員必須也是支持的格式類型)、NSDictionary(同NSArray)。
       2.其使用和讀取也是非常的簡單,像字典一樣的存取方式。
       3. NSUserDefaults 存儲的對象全是不可變的
       4.存儲輕量級的本地數據,一些簡單的數據(NSString類型的)例如密碼,網址等,NSUserDefaults肯定是首選。
       5.但是如果我們自定義了一個對象,對象保存的是一些信息,這時候就不能直接存儲到NSUserDefaults了
       6.本身不支持自定義對象的存儲
   #存儲: [[NSUserDefaults standardUserDefaults] setValue: @"str" forKey: @"str"];
   #讀取: NSString * str =[[NSUserDefaultsstandardUserDefaults] valueForKey: @"str"];
   同樣的也可以使用setObject:forKey:或者objectForKey:等字典存取方法

2.1例子①:
[簡介]:如果想要將上述數據類型的數據永久保存到NSUserDefaults中去,
只需要簡單的操作(一個Value 一個Key ),例如,想要保存一個NSString的對象,
代碼實現為:
//將NSString 對象存儲到 NSUserDefaults 中
NSString *passWord = @"1234567";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];
將數據取出也很簡單,只需要取出key 對應的值就好了,
代碼如下:
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord = [ user objectForKey:@"userPassWord"];
#注意:對相同的Key賦值約等于一次覆蓋,要保證每一個Key的唯一性
2.1例子②:使用方法
//1.獲得NSUserDefaults文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//2.向文件中寫入內容
[userDefaults setObject:@"AAA"forKey:@"a"];
[userDefaults setBool:YES forKey:@"sex"];
[userDefaults setInteger:21 forKey:@"age"];
//2.1立即同步
#[userDefaults synchronize];
//3.讀取文件
NSString *name = [userDefaults objectForKey:@"a"];
BOOL sex = [userDefaults boolForKey:@"sex"];
NSInteger age = [userDefaults integerForKey:@"age"];
NSLog(@"%@, %d, %ld", name, sex, age);
2.2如果我想要存儲一個 NSMutableArray 對象?
#我必須先創建一個不可變數組(NSArray)再將它存入NSUserDefaults中去。
代碼如下:
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
-
NSUserDefaults user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"記住存放的一定是不可變的"];
#取出數據是一樣的,想要用NSUserDefaults中的數據給可變數組賦值
/
-------------------------正確的賦值方法-------------- ----- */
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//可以用alloc 方法代替
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的一定是不可變的"]];

  • 2.3使用 NSUserDefaults 存儲自定義對象
    2.3.1將自定義類型轉換為NSData類型
    1.encodeWithCoder 方法 和 initWithCoder 方法
    2.應用場景
    #具體請過程請參考參考網站2
注意:
  1.偏好設置是專門用來保存應用程序的配置信息的,一般不要在偏好設置中保存其他數據。
  2.如果沒有調用synchronize方法,系統會根據I/O情況不定時刻地保存到文件中。所以如果需要立即寫入文件的就必須調用synchronize方法。
  3.偏好設置會將所有數據保存到同一個文件中。即preference目錄下的一個以此應用包名來命名的plist文件。
  • 3.對象歸檔
   簡介:
       1.對象歸檔是將對象歸檔以文件的形式保存到磁盤中(也稱為序列化,持久化),使用的時候讀取該文件的保存路徑讀取文件的內容(也稱為接檔,反序列化)。
       2.簡單對象歸檔--使用的兩個類:
                               1).NSKeyedArichiver
                               2).NSKeyedUnarchiver
    代碼實現如下:
     NSKeyedArichiver、NSKeyedUnarchiver
     NSString *homeDirectory = NSHomeDirectory(); //獲取根目錄
     NSString homePath = [homeDirectory stringByAppendingPathComponent:@"自定義文件名,如test.archiver"];
     NSArray *array = @[@"abc", @"123", @12];
     Bool flag = [NSKeyedArichiver archiveRootObject:array toFile:homePath];
     if(flag) {
                   NSLog(@"歸檔成功!");
      }
  • 4.自定義內容歸檔
    邏輯思路:
    歸檔:
         1.使用NSData實例作為歸檔的存儲數據
         2.添加歸檔的內容
         3.使用鍵值對
         4.完成歸檔
   解歸檔:
          1.從磁盤讀取文件,生成NSData實例
          2.根據NSData實例和初始化解歸檔實例解歸檔
          3.根據key訪問value
  • 5.SQLIte3
   上述方法都有一個致命的缺點,那就是都無法存儲大批量的數據,有性能的問題。
   舉例說明:使用歸檔。
    (1)數據的存取都必須是完整的,要求寫入的時候要一次性寫入,讀取的時候要一次性全部讀取,這涉及到應用的性能問題。
    (2)如果有1000條數據,此時要把第1001條數據存入,那么需要把所有的數據取出來,把這條數據加上去之后,再存入。
  • 6.CoreData
     了解:
         1.Core Data是蘋果官方推薦使用的數據持久化方式。
         2.在使用的過程中,不需要導入數據庫框架,也不需要使用sql語句操作數據庫,完全是按照面向對象的思想,使用實體模型來操作數據庫。
         3.在使用的過程中需要注意的是,如果模型發生了變化,可以選擇重新生成實體類文件,但是自動生成的數據庫并不會自動更新,需要考慮重新生成數據庫,
         4. Core Data能夠簡化操作,但是它不支持跨平臺使用,如果想實現跨平臺,就需要使用SQLite來進行數據持久化。     
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容