iOS開發(fā)中本地存儲主要有三種形式

iOS開發(fā)中本地存儲主要有三種形式

XML屬性列表(plist)歸檔

Preference(偏好設(shè)置)

NSKeyedArchiver歸檔(NSCoding)

應(yīng)用沙盒

什么是應(yīng)用沙盒

要想在本地存儲數(shù)據(jù),那就要知道一下什么是應(yīng)用沙盒

,其實很好理解應(yīng)用沙盒就是應(yīng)用的文件夾,與其他文件系統(tǒng)隔離。每一個iOS應(yīng)用都有自己的應(yīng)用沙盒,應(yīng)用必須待在自己的沙盒里,其它應(yīng)用不能訪問該沙盒。

如何獲取應(yīng)用沙盒路徑,可以通過打印NSHomeDirectory()來獲取應(yīng)用沙盒路徑,下圖為打印路徑結(jié)果:

圖片001

Melody_Zhy 是用戶文件夾(樣子是個小房子)

3CEC8EEB-C230-44BE-93B7-DF3B9A120A94

iOS8之后每次運行Xcode都會生成不同的沙盒路徑,不同之處就是最后這個文件夾名,可能是蘋果為了安全著想

應(yīng)用沙盒結(jié)構(gòu)分析

首先我們先來看下,應(yīng)用沙盒里面都有什么

圖片002

這里提一下Finder的快捷鍵 shift + com + g

可以前往任意路徑的文件夾,因此我們可以打印沙盒路徑之后將沙盒路徑復(fù)制到Finder前往路徑文件夾中,前往應(yīng)用沙盒。這是一個比較耽誤事的方法!幸好有一款叫做simpholders的app,它可以很簡單的訪問應(yīng)用的沙盒路徑,記得去下載simpholders2哦,第一代iOS8之后就不能用了,app很簡單易懂,用下就會了~

現(xiàn)在我們來看看應(yīng)用沙盒里面這些文件夾都是做什么用的

Documents :保存應(yīng)用運行時生成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時會備份該目錄。例如,游戲應(yīng)用可將游戲存檔保存在該目錄

Library/Caches :

保存應(yīng)用運行時生成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時不會備份該目錄。一般存儲體積大、不需要備份的非重要數(shù)據(jù)

Library/Preference :

保存應(yīng)用的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息。iTunes同步設(shè)備時會備份該目錄

tmp :

保存應(yīng)用運行時所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒有運行時,系統(tǒng)也可能會清除該目錄下的文件。iTunes同步設(shè)備時不會備份該目錄

應(yīng)用沙盒目錄的常見獲取方式

沙盒根目錄的獲取方式

正如上面我們所說:

NSString *home = NSHomeDirectory();

Documents文件夾的獲取方式(3種)

第一種( !笨!)

// 利用沙盒根目錄拼接字符串

NSString *homePath = NSHomeDirectory();

NSString *docPath = [homePath stringByAppendingString:@"/Documents"];

第二種( !還??!)

// 利用沙盒根目錄拼接”Documents”字符串

NSString *homePath = NSHomeDirectory();

NSString *docPath = [homePath

stringByAppendingPathComponent:@"Documents"];

但是不建議使用這種方法,因為不定哪天蘋果大大就把文件名稱改了呢-_-!

第三種( !~推薦~ !)

// NSDocumentDirectory 要查找的文件

// NSUserDomainMask 代表從用戶文件夾下找

// 在iOS中,只有一個目錄跟傳入的參數(shù)匹配,所以這個集合里面只有一個元素

NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,

NSUserDomainMask, YES)[0];

NSString *filePath = [path

stringByAppendingPathComponent:@"xxx.plist"];

這里我來詳細的說下NSSearchPathForDirectoriesInDomains這個方法的幾個參數(shù) :

<#NSSearchPathDirectory directory#> 這個參數(shù)代表要查找的文件,是個枚舉!

枚舉你懂的點擊去看看就知道了~

<#NSSearchPathDomainMask domainMask#> 這個參數(shù)代表從用戶文件夾下找,也是枚舉!

最后一個參數(shù)如果是NO的話,打印的路徑會是這種形式~/Documents,我們一般都會用YES,這樣可以獲取完整路徑字符串!

這個方法的返回值是一個數(shù)組,但在iOS中,只有一個目錄跟傳入的參數(shù)匹配,所以這個集合里面只有一個元素,所以我們?nèi)〉谝粋€元素!

Library/Caches文件夾的獲取方式(跟上面的方法相似)

這里我只用上面的第三種方法!注意第一個參數(shù)!

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,

NSUserDomainMask, YES)[0];

NSString *filePath = [path

stringByAppendingPathComponent:@"student.data"];

tmp文件夾的獲取方式

NSString *tmp= NSTemporaryDirectory();

Library/Preference文件夾的獲取方式

通過NSUserDefaults類存取該目錄下的設(shè)置信息!

!!!這個下面會有介紹!!!

XML屬性列表(plist)歸檔

plist文件

plist的根Type只能是字典(NSDictionary)或者是數(shù)組(NSArray)所以歸檔時我們只能將數(shù)組或字典保存到plist文件中,但是NSString也能通過歸檔保存到plist文件中同時它也可以通過stringWithContentsOfFile解檔,它保存到plist中時Type是空的,Value是有值的!

plist文件的歸檔

NSArray *arr = [[NSArray alloc] initWithObjects:@"1", @"2", nil];

// NSDocumentDirectory 要查找的文件

// NSUserDomainMask 代表從用戶文件夾下找

// 在iOS中,只有一個目錄跟傳入的參數(shù)匹配,所以這個集合里面只有一個元素

NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,

NSUserDomainMask, YES)[0];

NSString *filePath = [path

stringByAppendingPathComponent:@"xxx.plist"];

[arr writeToFile:filePath atomically:YES];

plist文件的解檔

NSString *filePath = [path

stringByAppendingPathComponent:@"xxx.plist"];

// 解檔

NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];

NSLog(@"%@", arr);

Preference(偏好設(shè)置)

OC中有一個NSUserDefaults的單例,它可以用來存儲用戶的偏好設(shè)置,例如:用戶名,字體的大小,用戶的一些設(shè)置等,下面我用兩個UISwitch來演示如何保存用戶設(shè)置開關(guān)的關(guān)閉狀態(tài)

保存用戶偏好設(shè)置

// 獲取用戶偏好設(shè)置對象

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

// 保存用戶偏好設(shè)置

[defaults setBool:self.one.isOn forKey:@"one"];

[defaults setBool:self.two.isOn forKey:@"two"];

//

注意:UserDefaults設(shè)置數(shù)據(jù)時,不是立即寫入,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了。

// 出現(xiàn)以上問題,可以通過調(diào)用synchornize方法強制寫入

// 現(xiàn)在這個版本不用寫也會馬上寫入 不過之前的版本不會

[defaults synchronize];

讀取用戶偏好設(shè)置

// 讀取用戶偏好設(shè)置

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

self.one.on = [defaults boolForKey:@"one"];

self.two.on = [defaults boolForKey:@"two"];

NSKeyedArchiver歸檔(NSCoding)

只有遵守了NSCoding協(xié)議的類才可以用NSKeyedArchiver歸檔和NSKeyedUnarchiver解檔,如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver歸檔和NSKeyedUnarchiver解檔~

下面我舉的??是歸檔解檔一個Student模型,因此該模型應(yīng)該遵守NSCoding協(xié)議

實現(xiàn)encodeWithCoder和initWithCoder方法

- (void)encodeWithCoder:(NSCoder *)coder

{

[coder encodeObject:self.name forKey:@"name"];

[coder encodeInteger:self.age forKey:@"age"];

}

- (instancetype)initWithCoder:(NSCoder *)coder

{

self = [super init];

if (self) {

self.age = [coder decodeIntegerForKey:@"age"];

self.name = [coder decodeObjectForKey:@"name"];

}

return self;

}

歸檔

Student *s1 = [[Student alloc] init];

s1.name = @"zzz";

s1.age = 18;

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,

NSUserDomainMask, YES)[0];

// 這個文件后綴可以是任意的,只要不與常用文件的后綴重復(fù)即可,我喜歡用data

NSString *filePath = [path

stringByAppendingPathComponent:@"student.data"];

// 歸檔

[NSKeyedArchiver archiveRootObject:s1 toFile:filePath];

解檔

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,

NSUserDomainMask, YES)[0];

NSString *filePath = [path

stringByAppendingPathComponent:@"student.data"];

// 解檔

Student *s = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

NSLog(@"%@----%ld", s.name, s.age);

這就是我想到的iOS開發(fā)中本地數(shù)據(jù)存儲的幾種方式,希望對大家有幫助~ 藍鷗iOS開發(fā),國內(nèi)口碑最好的iOS培訓(xùn)學(xué)院,詳情請咨詢官方網(wǎng)站http://www.lanou3g.com我們是一群熱愛IT的年輕人,如果你也愛IT、愛iOS開發(fā),歡迎前來藍鷗iPhone培訓(xùn)中心參觀學(xué)習(xí),讓我們共同為夢想發(fā)聲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內(nèi)容