iOS應(yīng)用數(shù)據(jù)存取的常用方式
XML屬性列表(plist)歸檔
Preference(偏好設(shè)置)
NSKeyedArchiver歸檔(NSCoding)
SQLite3
Core Data
1.應(yīng)用沙盒
每個(gè)iOS應(yīng)用都有自己的應(yīng)用沙盒(應(yīng)用沙盒就是文件系統(tǒng)目錄),與其他文件系統(tǒng)隔離嫌拣。應(yīng)用必須待在自己的沙盒里样悟,其他應(yīng)用不能訪問(wèn)該沙盒
應(yīng)用沙盒的文件系統(tǒng)目錄馒闷,如下圖所示(假設(shè)應(yīng)用的名稱叫Layer)
應(yīng)用程序包
:(上圖中的Layer)包含了所有的資源文件和可執(zhí)行文件
Documents
:保存應(yīng)用運(yùn)行時(shí)生成的需要持久化的數(shù)據(jù)
拂到,iTunes同步設(shè)備時(shí)會(huì)備份該目錄
。例如法挨,游戲應(yīng)用可將游戲存檔保存在該目錄
tmp
:保存應(yīng)用運(yùn)行時(shí)所需的臨時(shí)數(shù)據(jù)
谁榜,使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒(méi)有運(yùn)行時(shí)凡纳,系統(tǒng)也可能會(huì)清除該目錄下的文件窃植。iTunes同步設(shè)備時(shí)不會(huì)備份
該目錄
Library/Caches
:保存應(yīng)用運(yùn)行時(shí)生成的需要持久化的數(shù)據(jù)
,iTunes同步設(shè)備時(shí)不會(huì)備份
該目錄荐糜。一般存儲(chǔ)體積大巷怜、不需要備份的非重要數(shù)據(jù)
Library/Preferences
:保存應(yīng)用的所有偏好設(shè)置
葛超,iOS的Settings(設(shè)置)應(yīng)用會(huì)在該目錄中查找應(yīng)用的設(shè)置信息。iTunes同步設(shè)備時(shí)會(huì)備份
該目錄
應(yīng)用沙盒目錄的常見(jiàn)獲取方式
沙盒根目錄:
NSString *home = NSHomeDirectory();
Documents:(2種方式)
利用沙盒根目錄拼接”Documents”字符串
NSString *home = NSHomeDirectory();
NSString *documents = [home stringByAppendingPathComponent:@"Documents"];
// 不建議采用延塑,因?yàn)樾掳姹镜牟僮飨到y(tǒng)可能會(huì)修改目錄名
利用NSSearchPathForDirectoriesInDomains函數(shù)
NSUserDomainMask 代表從用戶文件夾下找
YES 代表展開(kāi)路徑中的波浪字符“~”
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// 在iOS中绣张,只有一個(gè)目錄跟傳入的參數(shù)匹配,所以這個(gè)集合里面只有一個(gè)元素
NSString *documents = [array objectAtIndex:0];
tmp:
NSString *tmp = NSTemporaryDirectory();
Library/Caches:(跟Documents類似的2種方法)
利用沙盒根目錄拼接”Caches”字符串
利用NSSearchPathForDirectoriesInDomains函數(shù)(將函數(shù)的第2個(gè)參數(shù)改為:NSCachesDirectory
即可)
Library/Preference:通過(guò)NSUserDefaults
類存取該目錄下的設(shè)置信息
2.屬性列表 plist
直接將數(shù)據(jù)寫(xiě)在代碼里面关带,不是一種合理的做法侥涵。如果數(shù)據(jù)經(jīng)常改,就要經(jīng)常翻開(kāi)對(duì)應(yīng)的代碼進(jìn)行修改豫缨,造成代碼擴(kuò)展性低
因此独令,可以考慮將經(jīng)常變的數(shù)據(jù)放在文件中進(jìn)行存儲(chǔ)端朵,程序啟動(dòng)后從文件中讀取最新的數(shù)據(jù)好芭。如果要變動(dòng)數(shù)據(jù),直接修改數(shù)據(jù)文件即可冲呢,不用修改代碼
屬性列表是一種XML格式
的文件
如果對(duì)象是NSString
舍败、NSDictionary
、NSArray
敬拓、NSData
邻薯、NSNumber
等類型,就可以使用writeToFile:atomically:
方法直接將對(duì)象寫(xiě)到屬性列表文件plist中,這種“屬性列表文件”的擴(kuò)展名是plist
乘凸,因此也稱為plist文件
2.1解析plist文件
獲得Plist文件的全路徑
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
加載plist文件
_shops = [NSArray arrayWithContentsOfFile:path];
2.2plist注意事項(xiàng)
plist的文件名不能叫做info
厕诡、Info
之類的
添加plist等文件資源的時(shí)候,一定要勾選下面的選項(xiàng)
3.偏好設(shè)置 NSUserDefaults
很多iOS應(yīng)用都支持偏好設(shè)置营勤,比如保存用戶名灵嫌、密碼、字體大小等設(shè)置葛作,iOS提供了一套標(biāo)準(zhǔn)的解決方案來(lái)為應(yīng)用加入偏好設(shè)置功能
每個(gè)應(yīng)用都有個(gè)NSUserDefaults
實(shí)例寿羞,通過(guò)它來(lái)存取偏好設(shè)置
比如,保存用戶名赂蠢、字體大小绪穆、是否自動(dòng)登錄
4.NSKeyedArchiver
如果對(duì)象是NSString
、NSDictionary
虱岂、NSArray
玖院、NSData
、NSNumber
等類型第岖,可以直接用NSKeyedArchiver
進(jìn)行歸檔
和恢復(fù)
不是所有的對(duì)象都可以直接用這種方法進(jìn)行歸檔难菌,只有遵守了NSCoding協(xié)議的對(duì)象
才可以
NSCoding協(xié)議
有2個(gè)方法:
encodeWithCoder:
每次歸檔對(duì)象時(shí),都會(huì)調(diào)用這個(gè)方法绍傲。一般在這個(gè)方法里面指定如何歸檔對(duì)象中的每個(gè)實(shí)例變量扔傅,可以使用encodeObject:forKey:
方法歸檔實(shí)例變量
initWithCoder:
每次從文件中恢復(fù)(解碼)對(duì)象時(shí)耍共,都會(huì)調(diào)用這個(gè)方法。一般在這個(gè)方法里面指定如何解碼文件中的數(shù)據(jù)為對(duì)象的實(shí)例變量猎塞,可以使用decodeObject:forKey
方法解碼實(shí)例變量
5.SQLite3 FMDataBase
SQLite3
是一款開(kāi)源
的嵌入式``關(guān)系型數(shù)據(jù)庫(kù)
试读,可移植性好、易使用荠耽、內(nèi)存開(kāi)銷小
SQLite3常用的5種數(shù)據(jù)類型:text
钩骇、integer
、float
铝量、boolean
倘屹、blob
SQLite3是無(wú)類型
的,意味著你可以保存任何類型的數(shù)據(jù)到任意表的任意字段中
慢叨。比如下列的創(chuàng)表語(yǔ)句是合法的:
create table t_person(name, age);
為了保證可讀性纽匙,建議還是把字段類型加上:
create table t_person(name text, age integer);
在iOS中使用SQLite3,首先要添加庫(kù)文件libsqlite3.dylib
和導(dǎo)入主頭文件