iOS筆記-數(shù)據(jù)存儲科普篇

任我的詩歌順著你的波濤奔向遠(yuǎn)方

數(shù)據(jù)存儲

將數(shù)據(jù)保存到手機(jī)里面,保存到應(yīng)用沙盒(app安裝到手機(jī)上的文件夾)
常見方式有以下幾種:
1.XML屬性列表(plist)歸檔
2.Preference(偏好設(shè)置)
3.NSKeyedArchiver歸檔(NSCoding)
4.SQLite3
5.Core Data

應(yīng)用沙盒

  • 每個iOS應(yīng)用都有自己的應(yīng)用沙盒(應(yīng)用沙盒就是文件系統(tǒng)目錄),與其他文件系統(tǒng)隔離。應(yīng)用必須待在自己的沙盒里,其他應(yīng)用不能訪問該沙盒

  • 應(yīng)用沙盒結(jié)構(gòu)分析(文件夾分析):

    • Documents:保存應(yīng)用運(yùn)行時生成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時會備份該目錄。例如,游戲應(yīng)用可將游戲存檔保存在該目錄

    • tmp:保存應(yīng)用運(yùn)行時所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒有運(yùn)行時,系統(tǒng)也可能會清除該目錄下的文件。iTunes同步設(shè)備時不會備份該目錄

    • Library/Caches:保存應(yīng)用運(yùn)行時生成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時不會備份該目錄。一般存儲體積大、不需要備份的非重要數(shù)據(jù)

    • Library/Preference:保存應(yīng)用的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息。iTunes同步設(shè)備時會備份該目錄

  • 應(yīng)用沙盒目錄的常見獲取方式

    • 沙盒根目錄
      • NSString * home = NSHomeDirectory();
    • Documents:(兩種方式)
      • 1.利用沙盒根目錄拼接“Documents”字符串(不建議使用)
    // 不建議采用,因?yàn)樾掳姹镜牟僮飨到y(tǒng)可能會修改目錄名
    NSString *home = NSHomeDirectory();
    NSString *documents = [home stringByAppendingPathComponent:@"Documents"];
    
      - 2.利用`NSSearchPathForDirectoriesInDomains`函數(shù)
    
    // NSUserDomainMask 代表從用戶文件夾下找
    // YES 代表展開路徑中的波浪字符“~”
    NSArray *array =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
    // 在iOS中,只有一個目錄跟傳入的參數(shù)匹配,所以這個集合里面只有一個元素
    NSString *documents = [array objectAtIndex:0];
    
    • tmp:
      • NSString *tmp = NSTemporaryDirectory();
    • Library/Caches:(跟Documents類似的2種方法)
      • 1.利用沙盒根目錄拼接”Caches”字符串
      • 2.利用NSSearchPathForDirectoriesInDomains函數(shù)(將函數(shù)的第2個參數(shù)改為:NSCachesDirectory即可)
    • Library/Preference
      • 通過NSUserDefaults類存取該目錄下的設(shè)置信息

1.plist存儲(屬性列表)

  • 屬性列表是一種XML格式的文件,拓展名為plist
  • 如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表文件中
存數(shù)據(jù)
  • Plist存儲,就是把某些對象寫成plist文件,主要描述數(shù)組,字典

  • plist文件一般用來存儲數(shù)組和字典

  • plist存儲是蘋果特有的,只有蘋果才能生成plist

  • plist存儲不能存儲自定義對象

  • 具體用法:

    • 1.定義一個字典
      NSDictionary *dict = @{@"age":@"18",@"name":@"xmg"};

    • 2.搜索文件夾路徑

      • Caches文件夾
      • 在某個范圍內(nèi)容搜索文件夾的路徑
      • directory:獲取哪個文件夾
      • domainMask:在哪個范圍下獲取
      • NSUserDomainMask:在用戶的范圍內(nèi)搜索
      • expandTilde是否展開全路徑,YES:展開
    //NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
    NSUserDomainMask, YES)[0];
    
    • 3.拼接文件全路徑
     NSString *filePath = [cachePath stringByAppendingPathComponent:@"dict.plist"];`
    
    - 4.寫入文件
    ```objc
    // File:文件全路徑 => 所有文件夾路徑 + 文件路徑
    [dict writeToFile:filePath atomically:YES];
    ```

#####讀數(shù)據(jù)
- 具體使用:
    - 1.獲取Caches文件夾路徑
    ```objc
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    ```
    - 2.拼接文件全路徑
    ```objc
        NSString *filePath = [cachePath stringByAppendingPathComponent:@"dict.plist"];
    ```
    - 3.讀取文件數(shù)據(jù)(存的時候用什么對象存,讀取的時候也用什么對象讀?。?    ```objc
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
    ```


####2.Preference(偏好設(shè)置)
- 很多iOS應(yīng)用都支持偏好設(shè)置,比如保存用戶名、密碼、字體大小等設(shè)置,iOS提供了一套標(biāo)準(zhǔn)的解決方案來為應(yīng)用加入偏好設(shè)置功能
- 每個應(yīng)用都有個NSUserDefaults實(shí)例,通過它來存取偏好設(shè)置
- 比如,保存用戶名、字體大小、是否自動登錄

#####存數(shù)據(jù)
```objc
    // 偏好設(shè)置NSUserDefaults
    // 底層就是封裝了一個字典,利用字典的方式生成plist
    // 好處:不需要關(guān)心文件名,快速進(jìn)行鍵值對存儲
    // name cyx
    [[NSUserDefaults standardUserDefaults] setObject:@"cyx" forKey:@"name"];
    // age 22
    [[NSUserDefaults standardUserDefaults] setInteger:22 forKey:@"age"];
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isOn"];
  • 注意:UserDefaults設(shè)置數(shù)據(jù)時,不是立即寫入,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了。出現(xiàn)以上問題,可以通過調(diào)用synchornize方法強(qiáng)制寫入
讀數(shù)據(jù)
   NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
  BOOL ison =  [[NSUserDefaults standardUserDefaults] boolForKey:@"isOn"];

3.NSKeyedArchiver歸檔(NSCoding)

寫數(shù)據(jù)

    // 歸檔:自定義對象一般使用歸檔,為什么自定義對象需要?dú)w檔,plist存儲不能存儲自定義對象

    Person *person = [[Person alloc] init];
    person.age = 22;
    person.name = @"cyx";

    // temp
    NSString *tempPath = NSTemporaryDirectory();

    // 拼接文件名
    NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];

    // 歸檔
    [NSKeyedArchiver archiveRootObject:person toFile:filePath];
    //  -[Person encodeWithCoder:]
讀數(shù)據(jù)
    // 什么對象存,讀取出來就是什么對象

    // temp
    NSString *tempPath = NSTemporaryDirectory();

    // 拼接文件名
    NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];

    // 解擋
   Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    // -[Person initWithCoder:]
    NSLog(@"%@ %d",p.name,p.age);


“未完待續(xù)...”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容