iOS中常用存儲方式

今天講四種,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ā)視頻動態(tài)人臉識別學習教程_11


點擊鏈接加入群【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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容