iOS數據存儲之偏好設置和屬性列表

前言

在iOS開發中必不可少的要用到數據存儲,數據的處理是iOS開發中的核心技術,適當的對數據進行持久化存儲可以實現應用的離線功能,以此提高用戶體驗。所謂數據持久化,就是將數據保存到硬盤中,使得在應用程序或手機重啟后可以繼續訪問之前保存的數據。在iOS開發中,有很多持久化得方案,接下來我將總結以下5種持久化方案:
1、plist(屬性列表)
2、preference(偏好設置)
3、NSKeyedArchiver(歸檔)
4、SQList 3 (FMDB)
5、CoreData
由于偏好設置是將所有數據保存到preference目錄下的一個以此應用包名來命名的plist文件中,所以將偏好設置和屬性列表放到一塊介紹。

沙盒機制

  • 在介紹各種存儲方法之前,先說明下沙盒機制。iOS應用程序只能在為改程序創建的文件系統中讀取文件,不可以去其他地方訪問,此區域被稱為沙盒,所以所有的非代碼文件都要保持在此,例如圖像,圖標,聲音,屬性列表,文本文件等。
    1、目錄結構
    1、“應用程序包”
    2、Documents
    3、Library
    Caches
    Preferences
    4、tmp
    2、目錄結構分析
    • 應用程序包:包含所有的資源文件和可執行文件
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSLog(@"%@", path);
    • Documents:保存應?運行時生成的需要持久化的數據,iTunes同步設備時會備份該目錄。
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      NSString *path = [path objectAtIndex:0];
      NSLog(@"%@", path);
    • Library/Caches: iTunes不會同步此文件夾,適合存儲體積大,不需要備份的非重要數據。
      NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
      NSLog(@"%@", path);
    • Library/Preferences: iTunes同步該應用時會同步此文件夾中的內容,通常保存應用的設置信息。
    • tmp: iTunes不會同步此文件夾,系統可能在應用沒運行時就刪除該目錄下的文件,所以此目錄適合保存應用中的一些臨時文件,用完就刪除
      NSString *path = NSTemporaryDirectory();
      NSLog(@"%@", path);
屬性列表(plist)

iOS提供了一種plist格式的文件(屬性列表)用于存儲輕量級的數據,屬性列表是一種XML格式的文件,拓展名為plist。如果對象是NSString、NSDictionary、NSArray、NSData、 NSNumber等類型,就可以使用writeToFile:atomically:?法 直接將對象寫到屬性列表文件中該格式保存的數據可以直接使用NSDictionary和NSArray讀取 。plist文件在iOS開發中屬于Write寫入方式,可以以Property List列表形式顯示,也可以以xml格式顯示。對于數據管理是很方便的。掌握使用plist文件數據操作很有必要

一、將數據寫入plist文件
  • 獲取文件路徑
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docPath = [path objectAtIndex:0];
    NSString *myFile = [docPath stringByAppendingPathComponent:@"test.plist"];
  • 存儲
    NSArray *array = @[@"123", @"456", @"789"];
    [array writeToFile:fileName atomically:YES];
  • 讀取
    NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
    NSDictionary * result = [NSDictionary dictionaryWithContentsOfFile:fileName];
    NSLog(@"%@", result);

注意
只有NSString、NSDictionary、NSArray、NSData、 NSNumber等類型才能使用plist文件存儲。
存儲時使用writeToFile: atomically:方法。 其中atomically表示是否需要先寫入一個輔助文件,再把輔助文件拷貝到目標文件地址。這是更安全的寫入文件方法,一般都寫YES。
plist文件的讀寫效率比較高,由于他的讀寫需要將所有的數據取出再全部保存,所以只適合小數據。

二、手動添加plist文件
  • 創建.plist文件。
    新建文件-->Resource-->Property List
plist.png

plist文件的根類型只能是NSArray或NSDictionary

GZO.jpg

可以在空白處右鍵“Add Row”添加數據或者點中“root”行,點擊“+”號即可添加。一般數據類型(Type)可以選擇Array、Dictionary、String等類型。同時也可以給添加的數據賦值(Value)。
除了以Property List列表形式顯示外,選中usersList.plist文件,右鍵“Open As”-“Source Code”可以以XML格式顯示。

2016.png
  • 將plist文件中的數據讀入對應的根類型
    //1、獲取文件所在的路徑,Resource:文件名稱、Type:文件格式
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"userInfos" ofType:@"plist"];
    // 2、從路徑中獲取對應格式的數據
    // 如果Root為NSArray,則使用數組保存
    NSArray *infos = [NSArray arrayWithContentsOfFile:filePath];
    NSLog(@"%@",infos);
    // 如果Root為NSDictionary,則使用字典保存
    NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:filePath];
    NSLog(@"%@",infoDic);
偏好設置
一、使用NSUserDefault 實現持久化
  • 下面來看下 NSUserDefault 本地保存的位置,Library/Preferences 這個目錄下的 plist 文件就是其保存的目錄。

  • NSUserDefault 的用法,主要是保存和讀取數據
    //初始化一個 NSUserDefault
    + (NSUserDefaults *)standardUserDefaults;
    //設置數據的方法
    - (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
    - (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
    - (void)setFloat:(float)value forKey:(NSString *)defaultName;
    - (void)setDouble:(double)value forKey:(NSString *)defaultName;
    - (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
    - (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

  • 讀取數據的方法:
    - (nullable id)objectForKey:(NSString *)defaultName;
    - (nullable NSString *)stringForKey:(NSString *)defaultName;
    - (nullable NSArray *)arrayForKey:(NSString *)defaultName;
    - (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
    - (nullable NSData *)dataForKey:(NSString *)defaultName;
    - (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;
    - (NSInteger)integerForKey:(NSString *)defaultName;
    - (float)floatForKey:(NSString *)defaultName;
    - (double)doubleForKey:(NSString *)defaultName;
    - (BOOL)boolForKey:(NSString *)defaultName;
    - (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

  • 刪除數據的方法:
    - (void)removeObjectForKey:(NSString *)defaultName;

  • 保存數據:
    // 如果不手動調用,系統會自動保存,但時間不定
    - (BOOL)synchronize;

  • 使用方法

      //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"];
    
  • 存儲id類型數據

     + (void)setValue:(id)value andKey:(NSString *)key
     {
          NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
          [userDefaults setObject:value forKey:key];
          [userDefaults synchronize];
     }
     // 獲取數據
     + (NSString *)getValueByKey:(NSString *)key
      {
          NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
          NSString *value = [settings objectForKey:key];
          return value;
      }
    

注意:

  • 偏好設置是專門用來保存應用程序的配置信息的,一般不要在偏好設置中保存其他數據。
  • 如果沒有調用synchronize方法,系統會根據I/O情況不定時刻地保存到文件中。所以如果需要立即寫入文件的就必須調用synchronize方法。
  • 偏好設置會將所有數據保存到同一個文件中。即preference目錄下的一個以此應用包名來命名的plist文件。

歡迎閱讀下一篇:

iOS-Ant-Bang互助社區 426981364
iOS技術交流群 461069757 歡迎加入!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 前言 iOS本地緩存數據方式有五種: 1.直接寫文件方式*.plist:可以存儲的對象有NSString、NSAr...
    隨心吧閱讀 2,027評論 0 18
  • iOS應用數據存儲的常用方式 XML屬性列表(plist)歸檔 Preference(偏好設置) NSKeyedA...
    擱淺的青蛙閱讀 453評論 0 0
  • NSUserDefaults適合存儲輕量級的本地數據,比如要保存一個登陸界面的數據,用戶名、密碼之類的,個人覺得使...
    Clark_new閱讀 2,161評論 2 7
  • iOS數據存儲 持久化存儲 概述: 持久化存儲——將數據保存在硬盤里,當應用程序重啟后可以訪問到之前存儲的數據。是...
    夏天的風_song閱讀 635評論 1 7
  • 不久之前,我來到陽澄湖馬術夏令營 , 第一天來的時候,我碰見了我四年沒有見到的小同學顧愷元,我迫不及待地沖過...
    胡城瑄閱讀 369評論 1 1