
數(shù)據(jù)存儲
將數(shù)據(jù)保存到手機(jī)里面,保存到應(yīng)用沙盒(app安裝到手機(jī)上的文件夾)
常見方式有以下幾種:
1.XML屬性列表(plist)歸檔
2.Preference(偏好設(shè)置)
3.NSKeyedArchiver歸檔(NSCoding)
4.SQLite3
5.Core Data
應(yīng)用沙盒
每個iOS應(yīng)用都有自己的應(yīng)用沙盒(應(yīng)用沙盒就是文件系統(tǒng)目錄),與其他文件系統(tǒng)隔離。應(yīng)用必須待在自己的沙盒里,其他應(yīng)用不能訪問該沙盒
-
應(yīng)用沙盒結(jié)構(gòu)分析(文件夾分析):
Documents:保存應(yīng)用運(yùn)行時生成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時會備份該目錄。例如,游戲應(yīng)用可將游戲存檔保存在該目錄tmp:保存應(yīng)用運(yùn)行時所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒有運(yùn)行時,系統(tǒng)也可能會清除該目錄下的文件。iTunes同步設(shè)備時不會備份該目錄Library/Caches:保存應(yīng)用運(yùn)行時生成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時不會備份該目錄。一般存儲體積大、不需要備份的非重要數(shù)據(jù)Library/Preference:保存應(yīng)用的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息。iTunes同步設(shè)備時會備份該目錄
-
應(yīng)用沙盒目錄的常見獲取方式
-
沙盒根目錄:
NSString * home = NSHomeDirectory();
-
Documents:(兩種方式)
- 1.利用沙盒根目錄拼接
“Documents”字符串(不建議使用)
- 1.利用沙盒根目錄拼接
// 不建議采用,因?yàn)樾掳姹镜牟僮飨到y(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類存取該目錄下的設(shè)置信息
- 通過
-
沙盒根目錄:
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(偏好設(shè)置)
- 很多iOS應(yīng)用都支持偏好設(shè)置,比如保存用戶名、密碼、字體大小等設(shè)置,iOS提供了一套標(biāo)準(zhǔn)的解決方案來為應(yīng)用加入偏好設(shè)置功能
- 每個應(yīng)用都有個NSUserDefaults實(shí)例,通過它來存取偏好設(shè)置
- 比如,保存用戶名、字體大小、是否自動登錄
#####存數(shù)據(jù)
```objc
// 偏好設(shè)置NSUserDefaults
// 底層就是封裝了一個字典,利用字典的方式生成plist
// 好處:不需要關(guān)心文件名,快速進(jì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è)置數(shù)據(jù)時,不是立即寫入,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了。出現(xiàn)以上問題,可以通過調(diào)用synchornize方法強(qiáng)制寫入
讀數(shù)據(jù)
NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
BOOL ison = [[NSUserDefaults standardUserDefaults] boolForKey:@"isOn"];
3.NSKeyedArchiver歸檔(NSCoding)
寫數(shù)據(jù)
// 歸檔:自定義對象一般使用歸檔,為什么自定義對象需要?dú)w檔,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);