標籤:
IOS應用資料存放區常用方式
- XML屬性列表(plist)歸檔- Preference(喜好設定)- NSKeyedArchiver歸檔(NSCoding)- SQLite3 - Core Data
應用程式沙箱
- 每個應用程式都有自己的應用沙箱(應用沙箱就是檔案系統目錄)與其它檔案系統隔離。應用必須呆在 自己的沙箱裡,其它應用不能訪問該沙箱
- 應用沙箱目錄<假設應用程式名稱字Layer>
應用沙箱結構分析
應用沙箱的常見擷取方式
NSString *home = NSHomeDirectory();NSString *documents = [home stringByAppendingPathComponent:@"Documents"];
// 不建議採用,因為新版本的作業系統可能會修改目錄名
- 利用NSSearchPathForDirectoriesInDomains函數
// NSUserDomainMask 代表從使用者檔案夾下找// YES 代表展開路徑中的波浪字元“~”NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
// 在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合裡面只有一個元素
NSString *documents = [array objectAtIndex:0];
屬性列表
- 屬性列表是一種XML格式的檔案,拓展名為plist- 如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表檔案中
// directory:擷取哪個檔案夾 NSCachesDirectory,搜尋caches檔案 // domainMask:擷取哪個範圍下檔案夾 NSUserDomainMask,表示在目前使用者下去搜尋 // expandTilde:是否展開全路徑 // 存放在/Library/Caches下 //擷取Caches檔案夾的路徑 NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; // 拼接檔案路徑 NSString *filePath =[cachesPath stringByAppendingPathComponent:@"user.plist"]; /* * 寫入檔案 */ [users writeToFile:filePath atomically:YES];
- 讀取檔案
/* * 讀取檔案 */ NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; NSString *path =[cachesPath stringByAppendingPathComponent:@"user.plist"]; NSArray *array =[NSArray arrayWithContentsOfFile:path]; NSLog(@"%@",array);
喜好設定
/* * NSUserDefaults用來專門做喜好設定儲存*/ /* * 優點:不需要關心檔案名稱,系統會自動建立 用來快速做索引值對的儲存*/ /* * 存放在 Library/Preferences 下 */ /* * 儲存 */ [[NSUserDefaults standardUserDefaults]setObject:@"jack" forKey:@"account"]; [[NSUserDefaults standardUserDefaults]setObject:@"123" forKey:@"pwd"]; [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"login"];
/* * 讀取 */ NSString *account = [[NSUserDefaults standardUserDefaults]objectForKey:@"account"]; BOOL login = [[NSUserDefaults standardUserDefaults]objectForKey:@"login"]; NSString *pwd = [[NSUserDefaults standardUserDefaults]objectForKey:@"pwd"]; NSLog(@"%@,%d,%@",account,login,pwd );
歸檔
#import <Foundation/Foundation.h>/* * 注意別寫成NSCopying */@interface Person : NSObject<NSCoding>/* * 年齡 */@property (nonatomic,assign)NSInteger age;/* * 名字 */@property (nonatomic,strong)NSString *name;
/* * 解檔屬性 */- (id)initWithCoder:(NSCoder *)aDecoder{#warning 只要父類遵守NSCodeing協議就會調用initWithCoder /* * UIView在解析的時候就會調用initWithCoder 方法 */ if (self = [super init]) { /* * 解檔屬性一定要儲存到成員變數中 */ _age =[aDecoder decodeIntegerForKey:@"age"]; _name = [aDecoder decodeObjectForKey:@"name"]; } return self;}/* * 告訴系統哪些對象需要歸檔 */- (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeInteger:_age forKey:@"age"];}
/* * 歸檔:自訂對象想要儲存到沙箱(檔案夾)必須使用歸檔 */ /* * 歸檔 */ Person *person =[[Person alloc]init]; person.age = 10; person.name = @"adobe"; /* * 擷取temp檔案夾路徑 */ NSString *temp =NSTemporaryDirectory(); /* * 讀取document檔案夾路徑 */ NSString *documentPath =NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask,YES)[0] ; /* * 拼接路徑 */ NSString *filePath =[temp stringByAppendingPathComponent:@"person.plist"]; [NSKeyedArchiver archiveRootObject:person toFile:filePath];
/* * 解檔 */ NSString *tempPath = NSTemporaryDirectory(); /* * 拼接路徑 */ NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.plist"]; Person *p =[NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; NSLog(@"%@,%ld",p.name,p.age);
IOS應用資料存放區