標籤:
iOS應用資料存放區的常用方式
- XML屬性列表(plist)歸檔
- Preference(喜好設定)
- NSKeyedArchiver歸檔
- SQLite3
- Core Data
應用沙箱
每個iOS應用都有自己的應用沙箱(應用沙箱就是檔案系統目錄),與其他檔案系統隔離。應用必須待在自己的沙箱裡,其他應用不能訪問該沙箱
沙箱的結構:
- 應用程式套件組合:包含了所有的資源檔和可執行檔
- Documents:儲存應用運行時產生的需要持久化的資料,iTunes同步裝置時會備份該目錄。例如,遊戲應用可將遊戲存檔儲存在該目錄
- tmp:儲存應用運行時所需的臨時資料,使用完畢後再將相應的檔案從該目錄刪除。應用沒有運行時,系統也可能會清除該目錄下的檔案。iTunes同步裝置時不會備份該目錄
- Library/Caches:儲存應用運行時產生的需要持久化的資料,iTunes同步裝置時不會備份該目錄。一般儲存體積大、不需要備份的非重要資料
- Library/Preference:儲存應用的所有喜好設定,iOS的Settings(設定)應用會在該目錄中尋找應用的設定資訊。iTunes同步裝置時會備份該目錄
應用沙箱目錄的常見擷取方式
l沙箱根目錄:NSString *home = NSHomeDirectory();
Documents:(2種方式)
(1)利用沙箱根目錄拼接”Documents”字串NSString *home = NSHomeDirectory();NSString *documents = [home stringByAppendingPathComponent:@"Documents"];// 不建議採用,因為新版本的作業系統可能會修改目錄名(2)利用NSSearchPathForDirectoriesInDomains函數// NSUserDomainMask 代表從使用者檔案夾下找// YES 代表展開路徑中的波浪字元“~”NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);// 在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合裡面只有一個元素NSString *documents = [array objectAtIndex:0]
tmp:
NSString *tmp = NSTemporaryDirectory();Library/Caches:(跟Documents類似的2種方法)利用沙箱根目錄拼接”Caches”字串利用NSSearchPathForDirectoriesInDomains函數(將函數的第2個參數改為:NSCachesDirectory即可)Library/Preference:通過NSUserDefaults類存取該目錄下的設定資訊
屬性列表屬性列表是一種XML格式的檔案,拓展名為plist如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表檔案中 屬性列表-歸檔NSDictionary將一個NSDictionary對象歸檔到一個plist屬性列表中
// 將資料封裝成字典NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:@"hello" forKey:@"name"];[dict setObject:@"15013141314" forKey:@"phone"];[dict setObject:@"27" forKey:@"age"];// 將字典持久化到Documents/stu.plist檔案中[dict writeToFile:path atomically:YES];
屬性列表-恢複NSDictionary
// 讀取Documents/stu.plist的內容,執行個體化NSDictionaryNSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];NSLog(@"name:%@", [dict objectForKey:@"name"]);NSLog(@"phone:%@", [dict objectForKey:@"phone"]);NSLog(@"age:%@", [dict objectForKey:@"age"]);
喜好設定
很多iOS應用都支援喜好設定,比如儲存使用者名稱、密碼、字型大小等設定,iOS提供了一套標準的解決方案來為應用加入喜好設定功能每個應用都有個NSUserDefaults執行個體,通過它來存取喜好設定。比如,儲存使用者名稱、字型大小、是否自動登入
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@"itcast" forKey:@"username"];[defaults setFloat:18.0f forKey:@"text_size"];[defaults setBool:YES forKey:@"auto_login"];
讀取上次儲存的設定
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];NSString *username = [defaults stringForKey:@"username"];float textSize = [defaults floatForKey:@"text_size"];BOOL autoLogin = [defaults boolForKey:@"auto_login"];
注意:UserDefaults設定資料時,不是立即寫入,而是根據時間戳記定時地把緩衝中的資料寫入本地磁碟。所以調用了set方法之後資料有可能還沒有寫入磁碟應用程式就終止了。出現以上問題,可以通過調用synchornize方法強制寫入 [defaults synchornize];
NSKeyedArchiver 如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔和恢複不是所有的對象都可以直接用這種方法進行歸檔,只有遵守了NSCoding協議的對象才可以NSCoding協議有2個方法:encodeWithCoder:每次歸檔對象時,都會調用這個方法。一般在這個方法裡面指定如何歸檔對象中的每個執行個體變數,可以使用encodeObject:forKey:方法歸檔執行個體變數initWithCoder:每次從檔案中恢複(解碼)對象時,都會調用這個方法。一般在這個方法裡面指定如何解碼檔案中的資料為對象的執行個體變數,可以使用decodeObject:forKey方法解碼執行個體變數 •歸檔一個NSArray對象到Documents/array.archive
NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];[NSKeyedArchiver archiveRootObject:array toFile:path];
•恢複(解碼)NSArray對象
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
黑馬程式員_iOS應用資料存放區-學習總結