[注意]轉載時請注明出處博客園-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/
ios應用數據存儲的常用方式主要有:
- XML屬性列表(plist)歸檔
- Preference(偏好設置)
- NSKeyedArchiver歸檔(NSCoding)
- SQLite3
- Core Data
ios應用沙盒機制
介紹這些方法之前,首先介紹一下應用沙盒的概念.
ios應用沙盒機制就是指ios應用程序只能在為該程序創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。(ios8之前是這個樣子,iOS8新開放了一種對幾個固定系統區域的擴展機制extension,它可以在一定程度上彌補iOS的沙盒機制對應用間通信的限制).
應用沙盒機制下,每個應用程序都有自己的存儲空間 ;應用程序不能翻過自己的圍牆去訪問別的存儲空間的內容 ;應用程序請求的數據都要通過權限檢測,假如不符合條件的話,不會被放行。
應用沙盒的結構主要如下:
Documents:保存應用運行時生成的需要持久化的數據,iTunes同步設備時會備份該目錄。例如,游戲應用可將游戲存檔保存在該目錄
ios應用沙盒目錄常見獲取方式
//獲取應用沙盒的根目錄 NSString *home = NSHomeDirectory(); //NSHomeDirectory()是一個c語言的方法
獲取Documents文件路徑的方法:
-
- 第一種方法:
- 首先,獲取應用沙盒的根目錄,再利用字符串的拼接函數,得到Documents目錄 (但是不建議采用這個方法,因為新版本的操作系統可能會修改目錄名)
- 第一種方法:
1 //第一種方法: 2 //獲取當前應用沙盒的根目錄 3 NSString *homePath = NSHomeDirectory(); 4 //拼接路徑 5 NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];
-
- 第二種方法
- 利用NSSearchPathForDirectoriesInDomains函數獲得Documents目錄
- 第二種方法
//第二種方法 NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
這個NSSearchPathForDirectoriesInDomains函數一共有三個參數(注意返回的是一個數組),第一個參數是代表獲取什么文件的路徑(枚舉選擇就可),系統已經幫我們封裝好.第二個參數代表從用戶文件夾下找,第三個參數代表查找時文件是否展開,這個參數一般就填為yes,否則的話可能找不到路徑,通過no,獲取的路徑,系統會將前面的路徑換為一個~,如下圖:
正常情況下,為YES的情況輸出如下圖:
所以此處注意:這個NSSearchPathForDirectoriesInDomains函數的第三個參數一般都要寫為YES.注意這個函數返回的是一個數組,但是在ios系統中的沙盒只有這樣的一個文件夾,所以取數組的第0個元素即可.
在mac系統中,有一個能自動找到應用沙盒的根目錄的軟件simpholder2.app,在測試使用是非常方便,可以下載使用.(需要的話請聯系595632239@163.com)
獲取應用沙盒tmp目錄的方法:
//獲取應用沙盒tmp目錄 NSString *tmp = NSTemporaryDirectory();
獲取應用沙盒caches目錄的方法:
1 //獲取應用沙盒tmp目錄 2 3 NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; 4 5 6 //當然也可以使用最開始上面介紹的字符串拼接方法獲得,此處不再贅述
獲取應用沙盒preference目錄的方法:
通過NSUserDefaults類存取該目錄下的設置信息
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
plist文件存取方式
屬性列表是一種XML格式的文件,拓展名為plist
1 - (IBAction)save { 2 3 //獲取應用沙盒的根目錄有兩種方法 4 // //第一種方法: 5 // //獲取當前應用沙盒的根目錄 6 // NSString *homePath = NSHomeDirectory(); 7 // //拼接路徑 8 // NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"]; 9 // 10 // //還要指定存儲文件的文件名稱,仍然使用字符串拼接 11 // NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 12 // //NSLog(@"%@",filePath); 13 14 //第二種方法 15 NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 16 //還要指定存儲文件的文件名稱,仍然使用字符串拼接 17 NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 18 NSLog(@"%@",filePath); 19 //新建一個數組(作為例子) 20 NSArray *array = @[@"abc",@123,@"a-d-g"]; 21 22 //將數組存儲到文件中 23 [array writeToFile:filePath atomically:YES]; 24 25 26 27 28 }
讀取操作:
1 - (IBAction)read { 2 3 //獲取Documents目錄 4 NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 5 //還要指定存儲文件的文件名稱,仍然使用字符串拼接 6 NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 7 8 9 //使用一個數組來接受數據 10 NSArray *array = [NSArray arrayWithContentsOfFile:filePath]; 11 NSLog(@"%@",array); 12 13 }
我這里是使用NSArray來進行測試存取的,也可以使用字典.但是有一點需要注意,就是存取字符串的時候,最好不要使用plist文件,因為plist本身不支持字符串(這個可以通過新建一個plist文件,打開之后,發現其根節點處,只有數組和字典兩個選項),而且字符串的存取方法也已經過期.
此處再順便 介紹一下上面提到的能自動找到應用沙盒的根目錄的軟件simpholder2.app軟件,安裝打開之后,
點擊之后就會自動打開當前應用的沙盒,非常方便測試使用.
最后附上程序的源代碼:
ViewController:

1 // 2 // ViewController.m 3 // 02-plist文件存取 4 // 5 // Created by hukezhu on 15/6/5. 6 // Copyright (c) 2015年 hukezhu. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController () 12 - (IBAction)save; 13 14 - (IBAction)read; 15 @end 16 17 @implementation ViewController 18 19 - (void)viewDidLoad { 20 [super viewDidLoad]; 21 // Do any additional setup after loading the view, typically from a nib. 22 } 23 24 - (void)didReceiveMemoryWarning { 25 [super didReceiveMemoryWarning]; 26 // Dispose of any resources that can be recreated. 27 } 28 29 //獲取應用沙盒的根目錄有兩種方法 30 //第一種方法: 31 32 33 34 - (IBAction)save { 35 36 //獲取應用沙盒的根目錄有兩種方法 37 // //第一種方法: 38 // //獲取當前應用沙盒的根目錄 39 // NSString *homePath = NSHomeDirectory(); 40 // //拼接路徑 41 // NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"]; 42 // 43 // //還要指定存儲文件的文件名稱,仍然使用字符串拼接 44 // NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 45 // //NSLog(@"%@",filePath); 46 47 //第二種方法 48 NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 49 //還要指定存儲文件的文件名稱,仍然使用字符串拼接 50 NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 51 NSLog(@"%@",filePath); 52 //新建一個數組(作為例子) 53 NSArray *array = @[@"abc",@123,@"a-d-g"]; 54 55 //將數組存儲到文件中 56 [array writeToFile:filePath atomically:YES]; 57 58 59 60 61 } 62 63 - (IBAction)read { 64 65 //獲取Documents目錄 66 NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 67 //還要指定存儲文件的文件名稱,仍然使用字符串拼接 68 NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 69 70 71 //使用一個數組來接受數據 72 NSArray *array = [NSArray arrayWithContentsOfFile:filePath]; 73 NSLog(@"%@",array); 74 75 } 76 @end
本篇文章只是說了一個plist文件的存取,剩下的文件存取方式,之后再介紹.
根據學習,整機整理相關知識點,如有錯誤不當之處,請批評指正,謝謝.
轉載:http://www.cocoachina.com/ios/20150720/12610.html