今天講四種,CoreData 這哥么我會(huì)專(zhuān)門(mén)講.別急
Preference(偏好設(shè)置)
NSKeyedArchiver歸檔(NSCoding)
SQLite3
Core Data
應(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)用的名稱(chēng)叫Layer)
下圖 结序,layer 為資源包
圖片描述
模擬器應(yīng)用沙盒的根路徑在: (apple是用戶(hù)名, 8.0是模擬器版本)
/Users/apple/Library/Application Support/iPhone Simulator/8.0/Applications
應(yīng)用沙盒結(jié)構(gòu)分析
應(yīng)用程序包:(上圖中的Layer)包含了所有的資源文件和可執(zhí)行文件
Documents:保存應(yīng)用運(yùn)行時(shí)生成的需要持久化的數(shù)據(jù)障斋,iTunes同步設(shè)備時(shí)會(huì)備份該目錄。例如徐鹤,游戲應(yīng)用可將游戲存檔保存在該目錄(很少用垃环,蘋(píng)果可能不審核通過(guò))
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/Preference:保存應(yīng)用的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會(huì)在該目錄中查找應(yīng)用的設(shè)置信息。iTunes同步設(shè)備時(shí)會(huì)備份該目錄
Plist 的存儲(chǔ)
NSSearchPathForDirectoriesInDomains 注意:返回的是一個(gè)數(shù)組
接下來(lái)直接上代碼
//?點(diǎn)擊存儲(chǔ)的調(diào)用-?(IBAction)save:(id)sender?{????//?數(shù)據(jù)存儲(chǔ),是保存到手機(jī)里面,
//?Plist存儲(chǔ),就是把某些對(duì)象寫(xiě)成plist文件,之前我們的plist文件描述數(shù)組,字典
//?plist存儲(chǔ)一般用來(lái)存儲(chǔ)數(shù)組和字典
//?Plist存儲(chǔ)是蘋(píng)果特有,只有蘋(píng)果才能生成plist
//?plist存儲(chǔ)不能存儲(chǔ)自定義對(duì)象
NSDictionary?*dict?=?@{@"age":@"18",@"name":@"USER"};
//?保存應(yīng)用沙盒(app安裝到手機(jī)上的文件夾)
//?Caches文件夾
//?在某個(gè)范圍內(nèi)容搜索文件夾的路徑
//?directory:獲取哪個(gè)文件夾
//?domainMask:在哪個(gè)范圍下獲取?NSUserDomainMask:在用戶(hù)的范圍內(nèi)搜索
//?expandTilde是否展開(kāi)全路徑,YES:展開(kāi)
NSString?*cachePath?=?NSSearchPathForDirectoriesInDomains(NSCachesDirectory,?NSUserDomainMask,?YES)[0];????NSLog(@"%@",cachePath);
//?拼接文件路徑
NSString?*filePath?=?[cachePath?stringByAppendingPathComponent:@"dict.plist"];
//????//?獲取應(yīng)用沙盒//????NSString?*homePath?=?NSHomeDirectory();????//????NSLog(@"%@",homePath);
//?File:文件全路徑?=>?所有文件夾路徑?+?文件路徑
[dict?writeToFile:filePath?atomically:YES];
}//?點(diǎn)擊讀取的調(diào)用-?(IBAction)read:(id)sender?{
NSString?*cachePath?=?NSSearchPathForDirectoriesInDomains(NSCachesDirectory,?NSUserDomainMask,?YES)[0];????NSLog(@"%@",cachePath);
//?拼接文件路徑
NSString?*filePath?=?[cachePath?stringByAppendingPathComponent:@"dict.plist"];
//?存的時(shí)候用什么對(duì)象存,讀取的時(shí)候也是用什么對(duì)象讀取
NSDictionary?*dict?=?[NSDictionary?dictionaryWithContentsOfFile:filePath];
NSLog(@"%@",dict);
}
偏好設(shè)置存儲(chǔ) NSUserDefaults
直接上代碼
-?(IBAction)save:(id)sender?{????//?偏好設(shè)置NSUserDefaults
//?底層就是封裝了一個(gè)字典,利用字典的方式生成plist
//?好處:不需要關(guān)心文件名,快速進(jìn)行鍵值對(duì)存儲(chǔ)
//?name?USER
[[NSUserDefaults?standardUserDefaults]?setObject:@"USER"?forKey:@"name"];????//?age?18
[[NSUserDefaults?standardUserDefaults]?setInteger:18?forKey:@"age"];
[[NSUserDefaults?standardUserDefaults]?setBool:YES?forKey:@"isOn"];
}
-?(IBAction)read:(id)sender?{
NSString?*name?=?[[NSUserDefaults?standardUserDefaults]?objectForKey:@"name"];??BOOL?ison?=??[[NSUserDefaults?standardUserDefaults]?boolForKey:@"isOn"];
NSLog(@"%@?%d",name,ison);
}
歸檔
自定義對(duì)象一般使用歸檔,為什么自定義對(duì)象需要?dú)w檔,plist存儲(chǔ)不能存儲(chǔ)自定義對(duì)象
如果一個(gè)自定義對(duì)象需要?dú)w檔,必須遵守NSCoding,而且實(shí)現(xiàn)相應(yīng)方法
全選復(fù)制放進(jìn)筆記@implementation?ViewController-?(IBAction)save:(id)sender?{
//?歸檔:自定義對(duì)象一般使用歸檔,為什么自定義對(duì)象需要?dú)w檔,plist存儲(chǔ)不能存儲(chǔ)自定義對(duì)象
Person?*person?=?[[Person?alloc]?init];
person.age?=?18;
person.name?=?@"USER";
//?temp
NSString?*tempPath?=?NSTemporaryDirectory();
//?拼接文件名
NSString?*filePath?=?[tempPath?stringByAppendingPathComponent:@"person.data"];
//?歸檔?????|?archive?v.存檔?n.檔案文件
[NSKeyedArchiver?archiveRootObject:person?toFile:filePath];????//??-[Person?encodeWithCoder:]}
-?(IBAction)read:(id)sender?{????//?什么對(duì)象存,讀取出來(lái)就是什么對(duì)象
//?temp
NSString?*tempPath?=?NSTemporaryDirectory();
//?拼接文件名
NSString?*filePath?=?[tempPath?stringByAppendingPathComponent:@"person.data"];
//?解檔
Person?*p?=?[NSKeyedUnarchiver?unarchiveObjectWithFile:filePath];????//?-[Person?initWithCoder:]
NSLog(@"%@?%d",p.name,p.age);
}
@end//?如果一個(gè)自定義對(duì)象需要?dú)w檔,必須遵守NSCoding,而且實(shí)現(xiàn)相應(yīng)方法@interface?Person?:?NSObject@property?(nonatomic,?assign)?int?age;@property?(nonatomic,?strong)?NSString?*name;@end@implementation?Person//?什么時(shí)候調(diào)用:只要一個(gè)自定義對(duì)象歸檔的時(shí)候就會(huì)調(diào)用//?作用:告訴蘋(píng)果當(dāng)前對(duì)象的哪些屬性需要?dú)w檔-?(void)encodeWithCoder:(NSCoder?*)aCoder
{
[aCoder?encodeObject:_name?forKey:@"name"];//encode??vt?編譯
[aCoder?encodeInt:_age?forKey:@"age"];
}//?什么時(shí)候調(diào)用:只要一個(gè)自定義對(duì)象解檔的時(shí)候就會(huì)調(diào)用//?作用:告訴蘋(píng)果當(dāng)前對(duì)象的哪些屬性需要解檔//?initWithCoder:只要解析一個(gè)文件的時(shí)候就會(huì)調(diào)用-?(id)initWithCoder:(NSCoder?*)aDecoder
{#warning?什么時(shí)候調(diào)用[super?initWithCoder]
if?(self?=?[super?init])?{????????//?注意:需要把解檔的屬性保存到成員屬性
_name?=?[aDecoder?decodeObjectForKey:@"name"];
_age?=?[aDecoder?decodeIntForKey:@"age"];
}????return?self;
}@endimplementation?RedView//?解析文件的時(shí)候調(diào)用//?作用:解析xib,storyboard調(diào)用-?(id)initWithCoder:(NSCoder?*)aDecoder
{????//?這里必須調(diào)用[super?initWithCoder:aDecoder],super?->UIView
//?什么時(shí)候調(diào)用[super?initWithCoder:aDecoder],只要父類(lèi)遵守了NSCoding協(xié)議,就調(diào)用[super?initWithCoder:aDecoder]
if?(self?=?[super?initWithCoder:aDecoder])?{????????NSLog(@"%s",__func__);
}????return??self;
}@end
想學(xué)習(xí)的小伙伴們可以加裙一起交流哦泌绣!626433463