iOS備忘錄之本地資料詳解
應用沙盒
1)每個iOS應用都有自己的應用沙盒(應用沙盒就是檔案系統目錄),與其他檔案系統隔離。應用必須待在自己的沙盒裡,其他應用不能訪問該沙盒
2)應用沙盒的檔案系統目錄,如下圖所示(假設應用的名稱叫Layer)
應用沙盒的檔案系統目錄
3)應用沙盒結構分析
-
應用程式包:(上圖中的Layer)包含了所有的資原始檔和可執行檔案
-
Documents:儲存應用執行時生成的需要持久化的資料,iTunes同步裝置時會備份該目錄。例如,遊戲應用可將遊戲存檔儲存在該目錄
-
tmp:儲存應用執行時所需的臨時資料,使用完畢後再將相應的檔案從該目錄刪除。應用沒有執行時,系統也可能會清除該目錄下的檔案。iTunes同步裝置時不會備份該目錄
-
Library/Caches:儲存應用執行時生成的需要持久化的資料,iTunes同步裝置時不會備份該目錄。一般儲存體積大、不需要備份的非重要資料
-
Library/Preference:儲存應用的所有偏好設定,iOS的Settings(設定)應用會在該目錄中查詢應用的設定資訊。iTunes同步裝置時會備份該目錄
4)應用沙盒目錄的常見獲取方式
-
沙盒根目錄:NSString *home = NSHomeDirectory();
-
Documents:(2種方式):
i)利用沙盒根目錄拼接”Documents”字串
1 2 3 |
NSString *home = NSHomeDirectory();
NSString *documents = [home stringByAppendingPathComponent:@ "Documents" ];
// 不建議採用,因為新版本的作業系統可能會修改目錄名
|
ii)利用NSSearchPathForDirectoriesInDomains函式
1 2 3 4 5 |
// NSUserDomainMask 代表從使用者資料夾下找
// YES 代表展開路徑中的波浪字元“~” NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// 在iOS中,只有一個目錄跟傳入的引數匹配,所以這個集合裡面只有一個元素
NSString *documents = [array objectAtIndex:0];
|
-
tmp:NSString *tmp = NSTemporaryDirectory();
-
Library/Caches:(跟Documents類似的2種方法)
i)利用沙盒根目錄拼接”Caches”字串
ii)利用NSSearchPathForDirectoriesInDomains函式(將函式的第2個引數改為:NSCachesDirectory即可)
-
Library/Preference:通過NSUserDefaults類存取該目錄下的設定資訊
iOS應用資料儲存的常用方式
-
XML屬性列表(plist)歸檔
-
Preference(偏好設定)
-
NSKeyedArchiver歸檔(NSCoding)
-
SQLite3
-
Core Data
XML屬性列表(plist)歸檔
屬性列表是一種XML格式的檔案,拓展名為plist。
如果物件是NSString、NSDictionary、NSArray、NSData、NSNumber等型別,就可以使用writeToFile:atomically:方法直接將物件寫到屬性列表檔案中。
舉個例子:將一個NSDictionary物件歸檔到一個plist屬性列表中
1 2 3 4 5 6 7 |
// 將資料封裝成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@ "母雞" forKey:@ "name" ];
[dict setObject:@ "15013141314" forKey:@ "phone" ];
[dict setObject:@ "27" forKey:@ "age" ];
// 將字典持久化到Documents/stu.plist檔案中
[dict writeToFile:path atomically:YES];
|
成功寫入到Documents目錄下:
執行結果
用文字編輯器開啟,檔案內容為:
文字編輯器檢視
用xcode開啟屬性檔案:
xcode檢視
讀取屬性列表,恢復NSDictionary物件
1 2 3 4 5 |
// 讀取Documents/stu.plist的內容,例項化NSDictionary
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
NSLog(@ "name:%@" , [dict objectForKey:@
|