第一篇:沙盒與資料持久化
目錄
一、沙盒
1、什麼是沙盒
2、沙盒下各個資料夾的作用及其路徑獲取
二、資料持久化
1、什麼是資料持久化
2、資料持久化的幾種方式
一、沙盒
1、什麼是沙盒
iOS系統會在硬碟上為每個App分配一塊專屬於它的儲存空間,就是沙盒,說白了沙盒其實就是一個資料夾,用來儲存和該App有關的所有資料。App只能訪問自己沙盒裡的資料,不能跨沙盒訪問。
2、沙盒下各個資料夾的作用及其路徑

沙盒的目錄結構
沙盒下一共有三個資料夾:Documents、Library和tmp。
Library資料夾下又有兩個資料夾:Caches和Preferences。
- 沙盒主路徑
NSLog(@"沙盒主路徑:%@", NSHomeDirectory());
- Documents資料夾的作用及其路徑
主要用來儲存需要持久化的資料,該資料夾會自動備份。
// 第一個引數:要查詢的資料夾 // 第二個引數:要查詢的使用者(iOS下只有一個使用者) // 第三個引數:是否顯示絕對路徑 // 注意:之所以要寫firstObject,是因為這個方法同時應用於MacOS和iOS開發,在MacOS下Documents資料夾是多個的,而iOS下只有一個,所以這個方法會返回一個數組,所以我們可以寫一下firstObject NSLog(@"Documents資料夾路徑:%@", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]);
- Library/Preferences資料夾的作用及其路徑
主要用來儲存需要持久化的資料,但我們通常不會直接操作這個資料夾,而是通過NSUserDefaults來間接地操作這個資料夾,該資料夾會自動備份。
NSLog(@"Preferences資料夾路徑:%@", [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"Preferences"]);
- Library/Caches資料夾的作用及其路徑
主要用來儲存App執行期間的一些快取資料,該資料夾不會自動備份,App記憶體不足時會被清理掉,App退出時可能會被清理掉。推薦將一些體積較大但不是很重要的資料儲存在這裡。
NSLog(@"Caches資料夾路徑:%@", [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]);
- tmp資料夾的作用及其路徑
主要用來儲存App執行期間的一些臨時資料,該資料夾不會自動備份,App退出時會自動清空。推薦將App執行期間需要臨時儲存的資料儲存在這裡,App退出後我們也不用管自動就清理掉了。
NSLog(@"tmp資料夾路徑:%@", NSTemporaryDirectory());
二、資料持久化
1、什麼是資料持久化
所謂資料持久化是指我們將App的某些資料儲存到它的沙盒中,以便App在重啟之後還能繼續訪問這些資料。
2、資料持久化的幾種方式
-
NSUserDefaults:它是一個單例,本質其實就是一個存在於 Library/Preferences下的plist檔案,它支援儲存的基本資料型別和基本物件型別,而複雜物件的話要歸檔為NSData之後才能存入,同時使用NSUserDefaults的時候還要知道它是非同步儲存的,我們需要主動呼叫它的synchronize方法來保證資料儲存的準確性。它主要用於一些小資料量資料的持久化,例如登入使用者的一些基本資訊和一些App的偏好設定等。
-
writeToFile:是指我們在沙盒裡自定義建立一些檔案,然後往這些檔案裡寫入資料,它支援儲存僅僅是基本物件型別,複雜物件或者圖片、音訊、視訊等媒體類檔案都必須歸檔為NSData之後才能存入,而且writeToFile對於基本物件型別的資料預設就是使用plist檔案儲存,所以我們可以弱化plist檔案是一種持久化方案的概念,而是直接使用writeToFile,其實plist檔案的本質就是writeToFile。我們不能把所有的小資料量資料都堆到NSUserDefaults裡吧,那樣資料雖然不會出問題,但是資料的管理就顯得很亂,比如我們做個本地購物車,這種小資料量的最好就用writeToFile,此外writeToFile還應用於媒體類檔案的持久化。
-
FMDB:FMDB其實就是對sqlite的OC封裝,它省去了比較麻煩的C函式編寫,代之以FMDatabase物件通過OC方法來執行sql語句,你要說程式碼少了多少好像也沒少多少,只不過程式碼編寫起來更加面向物件、程式員更舒服了、也更簡潔易懂了。更重要的是FMDB提供了FMDatabaseQueue和事務,前者用來保證資料庫在多執行緒訪問下的安全性,後者則可用來提高資料處理的效率。同時它又比CoreData使用起來更加靈活,所以開發中我一般使用它來持久化大資料量的資料。
-
CoreData:CoreData的話,它的核心其實就是通過對資料庫上下文的增刪查改來間接地操作sqlite資料庫,所以說本質上它還是對sqlite資料庫的封裝。它最大的特點就是視覺化操作和不用寫sql語句,完全面向model層面,所以更加面向物件,操作起來也比較簡單。但是對比FMDB,理論上來說CoreData的處理速度和效能都是比不上的,因為CoreData是在內部實現了從資料模型轉化到最終的sql操作,所以其效能自然比不上直接操作sqlite資料庫,而且佔用記憶體也比較大;再一個從使用來說,入門門檻比較高,想要達到得心應手的使用不是很容易。所以我感覺還是感覺FMDB更加靈活一些,我使用FMDB比較多。
綜上:前兩者的本質都是檔案持久化,適用於輕量級資料的持久化,而後兩者的本質都是對sqlite資料庫的封裝,適用於大批量資料的持久化。