數(shù)據(jù)存儲
將數(shù)據(jù)保存到手機里面,保存到應用沙盒(app安裝到手機上的文件夾)
常見方式有以下幾種:
1.XML屬性列表(plist)歸檔
2.Preference(偏好設置)
3.NSKeyedArchiver歸檔(NSCoding)
4.SQLite3
5.Core Data
應用沙盒
每個iOS應用都有自己的應用沙盒(應用沙盒就是文件系統(tǒng)目錄)突委,與其他文件系統(tǒng)隔離松靡。應用必須待在自己的沙盒里暂筝,其他應用不能訪問該沙盒
-
應用沙盒結(jié)構(gòu)分析(文件夾分析):
Documents
:保存應用運行時生成的需要持久化的數(shù)據(jù)拂共,iTunes同步設備時會備份該目錄紊馏。例如料饥,游戲應用可將游戲存檔保存在該目錄tmp
:保存應用運行時所需的臨時數(shù)據(jù),使用完畢后再將相應的文件從該目錄刪除朱监。應用沒有運行時岸啡,系統(tǒng)也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄Library/Caches
:保存應用運行時生成的需要持久化的數(shù)據(jù)赫编,iTunes同步設備時不會備份該目錄巡蘸。一般存儲體積大、不需要備份的非重要數(shù)據(jù)Library/Preference
:保存應用的所有偏好設置擂送,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息赡若。iTunes同步設備時會備份該目錄
-
應用沙盒目錄的常見獲取方式
-
沙盒根目錄:
NSString * home = NSHomeDirectory();
-
Documents:(兩種方式)
- 1.利用沙盒根目錄拼接
“Documents”
字符串(不建議使用)
- 1.利用沙盒根目錄拼接
// 不建議采用,因為新版本的操作系統(tǒng)可能會修改目錄名 NSString *home = NSHomeDirectory(); NSString *documents = [home stringByAppendingPathComponent:@"Documents"];
- 2.利用`NSSearchPathForDirectoriesInDomains`函數(shù)
// NSUserDomainMask 代表從用戶文件夾下找 // YES 代表展開路徑中的波浪字符“~” NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO); // 在iOS中团甲,只有一個目錄跟傳入的參數(shù)匹配逾冬,所以這個集合里面只有一個元素 NSString *documents = [array objectAtIndex:0];
-
tmp:
NSString *tmp = NSTemporaryDirectory();
-
Library/Caches:(跟Documents類似的2種方法)
- 1.利用沙盒根目錄拼接
”Caches”
字符串 - 2.利用
NSSearchPathForDirectoriesInDomains
函數(shù)(將函數(shù)的第2個參數(shù)改為:NSCachesDirectory
即可)
- 1.利用沙盒根目錄拼接
-
Library/Preference:
- 通過
NSUserDefaults
類存取該目錄下的設置信息
- 通過
-
沙盒根目錄:
1.plist存儲(屬性列表)
- 屬性列表是一種XML格式的文件,拓展名為plist
- 如果對象是NSString躺苦、NSDictionary身腻、NSArray、NSData匹厘、NSNumber等類型嘀趟,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表文件中
存數(shù)據(jù)
Plist存儲,就是把某些對象寫成plist文件愈诚,主要描述數(shù)組她按,字典
plist文件一般用來存儲數(shù)組和字典
plist存儲是蘋果特有的牛隅,只有蘋果才能生成plist
plist存儲不能存儲自定義對象
-
具體用法:
1.定義一個字典
NSDictionary *dict = @{@"age":@"18",@"name":@"xmg"};
-
2.搜索文件夾路徑
- Caches文件夾
- 在某個范圍內(nèi)容搜索文件夾的路徑
-
directory
:獲取哪個文件夾 -
domainMask
:在哪個范圍下獲取 -
NSUserDomainMask
:在用戶的范圍內(nèi)搜索 -
expandTilde
是否展開全路徑,YES:展開
//NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde); NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
- 3.拼接文件全路徑
NSString *filePath = [cachePath stringByAppendingPathComponent:@"dict.plist"];`
- 4.寫入文件
```objc
// File:文件全路徑 => 所有文件夾路徑 + 文件路徑
[dict writeToFile:filePath atomically:YES];
```
#####讀數(shù)據(jù)
- 具體使用:
- 1.獲取Caches文件夾路徑
```objc
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
```
- 2.拼接文件全路徑
```objc
NSString *filePath = [cachePath stringByAppendingPathComponent:@"dict.plist"];
```
- 3.讀取文件數(shù)據(jù)(存的時候用什么對象存,讀取的時候也用什么對象讀茸锰)
```objc
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
```
####2.Preference(偏好設置)
- 很多iOS應用都支持偏好設置媒佣,比如保存用戶名、密碼陵刹、字體大小等設置默伍,iOS提供了一套標準的解決方案來為應用加入偏好設置功能
- 每個應用都有個NSUserDefaults實例,通過它來存取偏好設置
- 比如衰琐,保存用戶名也糊、字體大小、是否自動登錄
#####存數(shù)據(jù)
```objc
// 偏好設置NSUserDefaults
// 底層就是封裝了一個字典,利用字典的方式生成plist
// 好處:不需要關(guān)心文件名,快速進行鍵值對存儲
// name cyx
[[NSUserDefaults standardUserDefaults] setObject:@"cyx" forKey:@"name"];
// age 22
[[NSUserDefaults standardUserDefaults] setInteger:22 forKey:@"age"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isOn"];
- 注意:UserDefaults設置數(shù)據(jù)時羡宙,不是立即寫入狸剃,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應用程序就終止了狗热。出現(xiàn)以上問題钞馁,可以通過調(diào)用synchornize方法強制寫入
讀數(shù)據(jù)
NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
BOOL ison = [[NSUserDefaults standardUserDefaults] boolForKey:@"isOn"];
3.NSKeyedArchiver歸檔(NSCoding)
寫數(shù)據(jù)
// 歸檔:自定義對象一般使用歸檔,為什么自定義對象需要歸檔,plist存儲不能存儲自定義對象
Person *person = [[Person alloc] init];
person.age = 22;
person.name = @"cyx";
// temp
NSString *tempPath = NSTemporaryDirectory();
// 拼接文件名
NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
// 歸檔
[NSKeyedArchiver archiveRootObject:person toFile:filePath];
// -[Person encodeWithCoder:]
讀數(shù)據(jù)
// 什么對象存,讀取出來就是什么對象
// temp
NSString *tempPath = NSTemporaryDirectory();
// 拼接文件名
NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
// 解擋
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
// -[Person initWithCoder:]
NSLog(@"%@ %d",p.name,p.age);