一.ios應用常用的數據存儲方式 1.plist(XML屬性列表歸檔) 2.偏好設置 3.NSKeydeArchiver歸檔(存儲自定義對象) 4.SQLite3(資料庫,關係型資料庫,不能直接存儲對象,要編寫一些資料庫的語句,將對象拆分存儲) 5.Core Data(對象型的資料庫,把內部環節屏蔽 ...
一.ios應用常用的數據存儲方式
1.plist(XML屬性列表歸檔)
2.偏好設置
3.NSKeydeArchiver歸檔(存儲自定義對象)
4.SQLite3(資料庫,關係型資料庫,不能直接存儲對象,要編寫一些資料庫的語句,將對象拆分存儲)
5.Core Data(對象型的資料庫,把內部環節屏蔽)
應用沙盒
每個ios應用都有自己的應用沙盒(應用沙盒就是文件系統目錄),與其它文件系統隔離。應用必須待在自己到沙盒裡,其他應用不能訪問該沙盒(提示:在ios8中已經開發訪問)。
應用沙盒的文件系統目錄,如下圖所示(假設應用的名稱叫Layer)
模擬器應用用沙盒的根路徑在: (apple是用用戶名,模擬器版本9.4.1)
/Users/apple/Library/Developer/CoreSimulator/Devices/CCBBF90E-03CE-4B92-827F-345635A6CD7E/data/Containers/Data/Application/30EF0702-4062-40F9-B82C-974679878206
應用沙盒結構分析 應用程式包:(上圖中的Layer)包含了所有的資源文件和可執行文件。
1) Documents:保存應用運行時生成的需要持久性的數據,iTunes同步設備時會備份該目錄。例如,游戲應用可將游戲存檔保存在該目錄。
2) tmp:保存應用運行時所需的臨時數據,使用完畢後再將相應的文件從該目錄刪除。應用沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄
3) Library 目錄:這個目錄下有兩個子目錄:Caches 和 Preferences
Library/Caches:保存應用運行時生成的需要持久化的數據,iTunes同步設備時不會備份該目錄。一般存儲體積大,不需要備份的非重要數據。
Library/Preference:保存應用的所有偏好設置,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息。iTunes同步設備時會備份該目錄。
4) AppNameApp 目錄:這是應用程式的程式包目錄,包含應用程式的本身。由於應用程式必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程式無法啟動。
四.應用沙盒常見的獲取方式
1.沙盒根目錄:NSString *home = NSHomeDirectory(); Documents目錄兩種方法
NSString *homeDir = NSHomeDirectory();
2.利用沙盒根目錄拼接”Documents”字元串
NSString *home = NSHomeDirectory(); NSString *documents = [home stringByAppendingPathComponent:@”Documents”];//不建議採用,因為新版本的操作系統可能會修改目錄名
3.利用 NSSearchPathForDirectoriesInDomains 函數
//NSUserDomainMask代表從用戶文件下找 //YES代表展開路徑中的波浪字元”~” NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);//在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合裡面只有一個元素 NSString *documents = [array objectAtIndex:0];
4. 獲取 tmp 目錄
NSString *tmp = NSTemporaryDirectory();
5.Library/Caches:(跟Documents類似的2種方法)
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachesDir = [paths objectAtIndex:0];
6.利用沙盒根目錄拼接”Caches”字元串
7.利用 NSSearchPathForDirectoriesInDomain 函數(將函數的2個參數改為:NSCachesDirectory即可)
8.Library/Preference:通過 NSUserDefaults 類存取該目錄下的設置信息
9.獲取應用程式程式包中資源文件路徑的方法: 例如獲取程式包中一個圖片資源(apple.png)路徑的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
代碼中的mainBundle類方法用於返回一個代表應用程式包的對象。
代碼:
#define CURRENT_SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #define CURRENT_SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height - 64) #define BUTTON_WIDTH 80 #define BUTTON_HEIGHT 40 @interface ViewController () //保存數據按鈕 @property(nonatomic,strong) UIButton *saveButton; //讀取數據按鈕 @property(nonatomic,strong) UIButton *readButton; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self initControl]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //初始化控制項 - (void)initControl{ _saveButton = [[UIButton alloc] initWithFrame:CGRectMake(CURRENT_SCREEN_WIDTH/2 - BUTTON_WIDTH/2, CURRENT_SCREEN_HEIGHT/2 - BUTTON_HEIGHT, BUTTON_WIDTH, BUTTON_HEIGHT)]; [_saveButton setTitle:@"保存數據" forState:UIControlStateNormal]; [_saveButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [_saveButton addTarget:self action:@selector(saveClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:_saveButton]; _readButton = [[UIButton alloc] initWithFrame:CGRectMake(CURRENT_SCREEN_WIDTH/2 - BUTTON_WIDTH/2, _saveButton.frame.origin.y + _saveButton.frame.size.height + 60, BUTTON_WIDTH, BUTTON_HEIGHT)]; [_readButton setTitle:@"讀取數據" forState:UIControlStateNormal]; [_readButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [_readButton addTarget:self action:@selector(readClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:_readButton]; } - (void)saveClick{ //獲取應用程式目錄 NSString *home = NSHomeDirectory(); NSLog(@"應用程式目錄:%@",home); //NSUserDomainMask在用戶目錄下查找 //YES 代表用戶目錄的~ //NSDocumentDirectory查找Documents文件夾 //建議使用如下方法動態獲取 NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSLog(@"Documents文件夾路徑:%@",doc); //拼接文件路徑 NSString *path = [doc stringByAppendingString:@"/abc.plist"]; //NSArray *array = @[@"ios",@"23"]; //[array writeToFile:path atomically:YES]; //NSDictionary *dict = @{@"name":@"ios",@"age":@"28"}; //[dict writeToFile:path atomically:YES]; /* plist只能存儲系統自帶的一些常規的類,也就是有writeToFile方法的對象才可以使用plist保持數據 字元串/字典/數據/NSNumber/NSData ... */ //自定義的對象不能保存到plist中 DBPerson *person = [[DBPerson alloc] init]; person.name = @"ios"; } - (void)readClick{ NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [doc stringByAppendingString:@"/abc.plist"]; //讀取數據 //NSArray *array = [NSArray arrayWithContentsOfFile:path]; //NSLog(@"%@",array); //NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; //NSLog(@"name = %@",[dict objectForKey:@"name"]); //NSLog(@"age = %@",[dict objectForKey:@"age"]); } @end
五.屬性列表
1.屬性列表是一種XML格式的文件,拓展名為plist。
2.如果對象是NSString,NSDictionary,NSArray,NSData,NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表文件中