今天講四種,CoreData 這哥么我會專門講.別急

點擊鏈接加入群【ios開發(fā)學習】:https://jq.qq.com/?_wv=1027&k=4FQgFH5
屬性列表(plist)歸檔
Preference(偏好設置)
NSKeyedArchiver歸檔(NSCoding)
SQLite3
Core Data
應用沙盒
每個iOS應用都有自己的應用沙盒(應用沙盒就是文件系統(tǒng)目錄),與其他文件系統(tǒng)隔離。應用必須待在自己的沙盒里,其他應用不能訪問該沙盒
應用沙盒的文件系統(tǒng)目錄,如下圖所示(假設應用的名稱叫Layer)
下圖 ,layer 為資源包
圖片描述
模擬器應用沙盒的根路徑在: (apple是用戶名, 8.0是模擬器版本)
/Users/apple/Library/Application Support/iPhone Simulator/8.0/Applications
應用沙盒結構分析
應用程序包:(上圖中的Layer)包含了所有的資源文件和可執(zhí)行文件
Documents:保存應用運行時生成的需要持久化的數(shù)據(jù),iTunes同步設備時會備份該目錄。例如,游戲應用可將游戲存檔保存在該目錄(很少用,蘋果可能不審核通過)
tmp:保存應用運行時所需的臨時數(shù)據(jù),使用完畢后再將相應的文件從該目錄刪除。應用沒有運行時,系統(tǒng)也可能會清除該目錄下的文件。iTunes同 步設備時不會備份該目錄
Library/Caches:保存應用運行時生成的需要持久化的數(shù)據(jù),iTunes同步設備時不會備份該目錄。一般存儲體積大、不需要備份的非重要數(shù)據(jù)
Library/Preference:保存應用的所有偏好設置,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息。iTunes同步設備時會備份該目錄
Plist 的存儲
NSSearchPathForDirectoriesInDomains 注意:返回的是一個數(shù)組
接下來直接上代碼
//?點擊存儲的調用-?(IBAction)save:(id)sender?{????//?數(shù)據(jù)存儲,是保存到手機里面,
//?Plist存儲,就是把某些對象寫成plist文件,之前我們的plist文件描述數(shù)組,字典
//?plist存儲一般用來存儲數(shù)組和字典
//?Plist存儲是蘋果特有,只有蘋果才能生成plist
//?plist存儲不能存儲自定義對象
NSDictionary?*dict?=?@{@"age":@"18",@"name":@"USER"};
//?保存應用沙盒(app安裝到手機上的文件夾)
//?Caches文件夾
//?在某個范圍內(nèi)容搜索文件夾的路徑
//?directory:獲取哪個文件夾
//?domainMask:在哪個范圍下獲取?NSUserDomainMask:在用戶的范圍內(nèi)搜索
//?expandTilde是否展開全路徑,YES:展開
NSString?*cachePath?=?NSSearchPathForDirectoriesInDomains(NSCachesDirectory,?NSUserDomainMask,?YES)[0];????NSLog(@"%@",cachePath);
//?拼接文件路徑
NSString?*filePath?=?[cachePath?stringByAppendingPathComponent:@"dict.plist"];
//????//?獲取應用沙盒//????NSString?*homePath?=?NSHomeDirectory();????//????NSLog(@"%@",homePath);
//?File:文件全路徑?=>?所有文件夾路徑?+?文件路徑
[dict?writeToFile:filePath?atomically:YES];
}//?點擊讀取的調用-?(IBAction)read:(id)sender?{
NSString?*cachePath?=?NSSearchPathForDirectoriesInDomains(NSCachesDirectory,?NSUserDomainMask,?YES)[0];????NSLog(@"%@",cachePath);
//?拼接文件路徑
NSString?*filePath?=?[cachePath?stringByAppendingPathComponent:@"dict.plist"];
//?存的時候用什么對象存,讀取的時候也是用什么對象讀取
NSDictionary?*dict?=?[NSDictionary?dictionaryWithContentsOfFile:filePath];
NSLog(@"%@",dict);
}
偏好設置存儲 NSUserDefaults
直接上代碼
-?(IBAction)save:(id)sender?{????//?偏好設置NSUserDefaults
//?底層就是封裝了一個字典,利用字典的方式生成plist
//?好處:不需要關心文件名,快速進行鍵值對存儲
//?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);
}
點擊鏈接加入群【ios開發(fā)學習】:https://jq.qq.com/
歸檔
自定義對象一般使用歸檔,為什么自定義對象需要歸檔,plist存儲不能存儲自定義對象
如果一個自定義對象需要歸檔,必須遵守NSCoding,而且實現(xiàn)相應方法
全選復制放進筆記@implementation?ViewController-?(IBAction)save:(id)sender?{
//?歸檔:自定義對象一般使用歸檔,為什么自定義對象需要歸檔,plist存儲不能存儲自定義對象
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?{????//?什么對象存,讀取出來就是什么對象
//?temp
NSString?*tempPath?=?NSTemporaryDirectory();
//?拼接文件名
NSString?*filePath?=?[tempPath?stringByAppendingPathComponent:@"person.data"];
//?解檔
Person?*p?=?[NSKeyedUnarchiver?unarchiveObjectWithFile:filePath];????//?-[Person?initWithCoder:]
NSLog(@"%@?%d",p.name,p.age);
}
@end//?如果一個自定義對象需要歸檔,必須遵守NSCoding,而且實現(xiàn)相應方法@interface?Person?:?NSObject@property?(nonatomic,?assign)?int?age;@property?(nonatomic,?strong)?NSString?*name;@end@implementation?Person//?什么時候調用:只要一個自定義對象歸檔的時候就會調用//?作用:告訴蘋果當前對象的哪些屬性需要歸檔-?(void)encodeWithCoder:(NSCoder?*)aCoder
{
[aCoder?encodeObject:_name?forKey:@"name"];//encode??vt?編譯
[aCoder?encodeInt:_age?forKey:@"age"];
}//?什么時候調用:只要一個自定義對象解檔的時候就會調用//?作用:告訴蘋果當前對象的哪些屬性需要解檔//?initWithCoder:只要解析一個文件的時候就會調用-?(id)initWithCoder:(NSCoder?*)aDecoder
{#warning?什么時候調用[super?initWithCoder]
if?(self?=?[super?init])?{????????//?注意:需要把解檔的屬性保存到成員屬性
_name?=?[aDecoder?decodeObjectForKey:@"name"];
_age?=?[aDecoder?decodeIntForKey:@"age"];
}????return?self;
}@endimplementation?RedView//?解析文件的時候調用//?作用:解析xib,storyboard調用-?(id)initWithCoder:(NSCoder?*)aDecoder
{????//?這里必須調用[super?initWithCoder:aDecoder],super?->UIView
//?什么時候調用[super?initWithCoder:aDecoder],只要父類遵守了NSCoding協(xié)議,就調用[super?initWithCoder:aDecoder]
if?(self?=?[super?initWithCoder:aDecoder])?{????????NSLog(@"%s",__func__);
}????return??self;
}@end
想學習的小伙伴們可以加裙一起交流哦!626433463