iOS本地?cái)?shù)據(jù)存儲(chǔ)方案匯總

常見(jiàn)存儲(chǔ)方式

  • Plist 格式文件存儲(chǔ)
  • NSUserDefaults 沙盒存儲(chǔ)(個(gè)人偏好存儲(chǔ))
  • 文件讀寫(xiě)儲(chǔ)存
  • 解歸檔存儲(chǔ)
  • 數(shù)據(jù)庫(kù)存儲(chǔ)
  • Keychain 存儲(chǔ)(可解決設(shè)備唯一標(biāo)識(shí)問(wèn)題)

Demo 示例

  • 文件讀寫(xiě)操作画舌、沙盒操作、解歸檔操作渣蜗、依賴 FMDB 的數(shù)據(jù)庫(kù)操作 以及 UIWeb/WKWeb 緩存清理 、NSPredicate 數(shù)據(jù)篩查等操作 DataStore Git地址
demo1.png
  • 依賴 MagicalRecord 的數(shù)據(jù)庫(kù)操作 CoreDataPro
demo2.png
demo1_0.png
  • Demo 做筆記使用绷旗,持續(xù)更新 委煤。康铭。。

數(shù)據(jù)存儲(chǔ)基礎(chǔ)

  • 作為移動(dòng)端開(kāi)發(fā)工程師披粟,所需要的數(shù)據(jù)幾乎全部都是通過(guò)網(wǎng)絡(luò)獲取彩扔,而且網(wǎng)絡(luò)請(qǐng)求都有時(shí)耗;在網(wǎng)絡(luò)好的情況下這種時(shí)耗雖然不足考慮僻爽,但是一旦網(wǎng)絡(luò)環(huán)境不好虫碉,會(huì)很影響產(chǎn)品體驗(yàn)。網(wǎng)絡(luò)環(huán)境無(wú)法控制胸梆,但是對(duì)于一些數(shù)據(jù)不經(jīng)常變動(dòng)的網(wǎng)絡(luò)請(qǐng)求或沒(méi)必要實(shí)時(shí)更新的數(shù)據(jù)敦捧,我們可以選擇將網(wǎng)絡(luò)數(shù)據(jù)緩存本地,適時(shí)更新碰镜。

  • 在iOS中涉及存儲(chǔ)方式不外乎這幾種兢卵,只是大家各自的分類方式可能有些不同。這里僅是自己的思考與分類绪颖。

  • 了解緩存秽荤,有必要先了解一下沙盒這個(gè)概念。
    沙盒其實(shí)質(zhì)就是在iOS系統(tǒng)下,每個(gè)應(yīng)用在內(nèi)存中所對(duì)應(yīng)的儲(chǔ)存空間窃款。
    每個(gè)iOS應(yīng)用都有自己的應(yīng)用沙盒(文件系統(tǒng)目錄)课兄,與其他文件系統(tǒng)隔離,各個(gè)沙盒之間相互獨(dú)立晨继,而且不能相互訪問(wèn)(手機(jī)沒(méi)有越獄的情況下)烟阐。
    各個(gè)應(yīng)用程序的沙盒是相互獨(dú)立的,在系統(tǒng)內(nèi)存消耗過(guò)高時(shí)紊扬,系統(tǒng)會(huì)收到內(nèi)存警告并自動(dòng)將一些退出軟件蜒茄。這就保證了系統(tǒng)的數(shù)據(jù)的安全性及系統(tǒng)的穩(wěn)定性。

  • 一個(gè)應(yīng)用的沙盒目錄如下:

sh1.png
sh2.png
sh3.png
sh4.png
sh5.png
  • Documents 應(yīng)用程序在運(yùn)行時(shí)生成的一些需要長(zhǎng)久保存的數(shù)據(jù)餐屎。
  • Library/Caches 儲(chǔ)存應(yīng)用程序網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)信息(音視頻與圖片等的緩存)檀葛。此目錄下的數(shù)據(jù)不會(huì)自動(dòng)刪除,需要程序員手動(dòng)清除該目錄下的數(shù)據(jù)腹缩。主要用于保存應(yīng)用在運(yùn)行時(shí)生成的需要長(zhǎng)期使用的數(shù)據(jù).一般用于存儲(chǔ)體積較大數(shù)據(jù)驻谆。
  • Library/Preferences 設(shè)置應(yīng)用的一些功能會(huì)在該目錄中查找相應(yīng)設(shè)置的信息,該目錄由系統(tǒng)自動(dòng)管理,通常用來(lái)儲(chǔ)存一些基本的應(yīng)用配置信息,比如賬號(hào)密碼,自動(dòng)登錄等。
  • tmp 保存應(yīng)用運(yùn)行時(shí)產(chǎn)生的一些臨時(shí)數(shù)據(jù);應(yīng)用程序退出庆聘、系統(tǒng)空間不夠、手機(jī)重啟等情況下都會(huì)自動(dòng)清除該目錄的數(shù)據(jù)勺卢,iTunes或iCloud也不會(huì)對(duì)其進(jìn)行備份伙判。無(wú)需程序員手動(dòng)清除該目錄中的數(shù)據(jù)。
  • SystemData - 近期優(yōu)化項(xiàng)目數(shù)據(jù)存儲(chǔ)黑忱,發(fā)現(xiàn)多了該文件路徑宴抚,暫未做過(guò)多研究。

Plist 格式文件存儲(chǔ)

  • plist文件甫煞,即屬性列表文件菇曲。
  • 可以存儲(chǔ)的數(shù)據(jù)類型有 Array Dictionary String Boolean Date Data Number。
  • 常用于儲(chǔ)存用戶的設(shè)置 或 存儲(chǔ)項(xiàng)目中經(jīng)常用到又不經(jīng)常修改的數(shù)據(jù)抚吠。
  • 創(chuàng)建 .plist 文件可以使用可視化工具即Xcode ,也可以使用代碼常潮。
  • 不適合存儲(chǔ)大量數(shù)據(jù),而且只能存儲(chǔ)基本數(shù)據(jù)類型楷力。
  • 雖然可以實(shí)現(xiàn) :增 刪 改 查 等操作喊式,但由于數(shù)據(jù)的存取必須是一次性全部操作,所以性能方面表現(xiàn)并不好萧朝。

文件創(chuàng)建

plist_create.png

字符串寫(xiě)入

plist_string_write.png

數(shù)組寫(xiě)入

plist_arr_write.png

字典寫(xiě)入

plist_dic_write.png

數(shù)據(jù)讀取

plist_read.png

NSUserDefaults 沙盒存儲(chǔ)(個(gè)人偏好存儲(chǔ))

  • 補(bǔ)充幾個(gè)方法:

isSubclassOfClass :參數(shù)為類 - 參數(shù)類為其子類或本身 岔留;

isMemberOfClass :參數(shù)為實(shí)例對(duì)象 - 參數(shù)所屬類為其本身 ;

isKindOfClass :參數(shù)為實(shí)例對(duì)象 - 參數(shù)所屬類為其子類或本身 检柬。

  • 應(yīng)用程序啟動(dòng)后献联,會(huì)在沙盒路徑Library -> Preferences 下默認(rèn)生成以工程bundle為名字的 .plist 文件 , 該方式存儲(chǔ)的數(shù)據(jù)即存進(jìn)該文件當(dāng)中。
  • 常用語(yǔ)存儲(chǔ)用戶的個(gè)人偏好設(shè)置。
  • 這種方式本質(zhì)是操作plist文件里逆,所以性能方面的考慮同plist文件數(shù)據(jù)儲(chǔ)存进胯。
default_write_before.png
default_write_after.png
default_read.png

文件讀寫(xiě)儲(chǔ)存

  • 文件操作可通過(guò)單例 NSFileManager 處理。文件存儲(chǔ)的路徑可以代碼設(shè)置运悲。
  • 可以存儲(chǔ)大量數(shù)據(jù)龄减,對(duì)數(shù)據(jù)格式?jīng)]有限制。
  • 但由于數(shù)據(jù)的存取必須是一次性全部操作班眯,所以在頻繁操作數(shù)據(jù)方面性能欠缺希停。

解歸檔存儲(chǔ)

  • plist 與 NSUserDefaults(個(gè)人偏好設(shè)置)兩種類型的儲(chǔ)存只適用于系統(tǒng)自帶的一些常用類型,而且前者必須拿到文件路徑署隘,后者也只能儲(chǔ)存應(yīng)用的主要信息宠能。
  • 對(duì)于開(kāi)發(fā)中自定義的數(shù)據(jù)模型的儲(chǔ)存,我們可以考慮使用歸檔儲(chǔ)存方案磁餐。
  • 歸檔保存數(shù)據(jù)违崇,文件格式自己可以任意,沒(méi)有要求 ; 即便設(shè)置為常用的數(shù)據(jù)格式(如:.c .txt .plist 等)要么不能打開(kāi)诊霹,要么打開(kāi)之后亂碼顯示羞延。
  • 值得注意的是使用歸檔保存的自定義模型需要實(shí)現(xiàn)NSCoding協(xié)議下的兩個(gè)方法。
  • 不適合存儲(chǔ)大量數(shù)據(jù)脾还,可以存儲(chǔ)自定義的數(shù)據(jù)模型伴箩。
  • 雖然歸檔可以存儲(chǔ)自定義的數(shù)據(jù)結(jié)構(gòu),但在大批量處理數(shù)據(jù)時(shí)鄙漏,性能上仍有所欠缺嗤谚。
encode.png

數(shù)據(jù)庫(kù)存儲(chǔ)

  • SQLite : 它是一款輕型的嵌入式數(shù)據(jù)庫(kù),安卓和ios開(kāi)發(fā)使用的都是SQLite數(shù)據(jù)庫(kù)怔蚌;占用資源非常的低巩步,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了桦踊;而且它的處理速度比Mysql椅野、PostgreSQL這兩款著名的數(shù)據(jù)庫(kù)都還快。

  • FMDB 正式基于 SQLite 開(kāi)發(fā)的一套開(kāi)源庫(kù)籍胯。使用時(shí)鳄橘,需要自己寫(xiě)一些簡(jiǎn)單的SQLite語(yǔ)句。

  • CoreData 是蘋(píng)果給出的一套基于 SQLite 的數(shù)據(jù)存儲(chǔ)方案芒炼;而且不需要自己寫(xiě)任何SQLite語(yǔ)句瘫怜。該功能依賴于 CoreData.framework 框架,該框架已經(jīng)很好地將數(shù)據(jù)庫(kù)表和字段封裝成了對(duì)象和屬性本刽,表之間的一對(duì)多鲸湃、多對(duì)多關(guān)系則封裝成了對(duì)象之間的包含關(guān)系赠涮。

  • Core Data的強(qiáng)大之處就在于這種關(guān)系可以在一個(gè)對(duì)象更新時(shí),其關(guān)聯(lián)的對(duì)象也會(huì)隨著更新暗挑,相當(dāng)于你更新一張表的時(shí)候笋除,其關(guān)聯(lián)的其他表也會(huì)隨著更新。Core Data的另外一個(gè)特點(diǎn)就是提供了更簡(jiǎn)單的性能管理機(jī)制炸裆,僅提供幾個(gè)類就可以管理整個(gè)數(shù)據(jù)庫(kù)垃它。由于直接使用蘋(píng)果提供的CoreData容易出錯(cuò),這里提供一個(gè)很好的三方庫(kù) MagicalRecord 烹看。

  • 關(guān)于 Core Data 想吐槽的是国拇,數(shù)據(jù)存儲(chǔ)功能雖然封裝的很好、功能很強(qiáng)大惯殊,但是版本迭代中反復(fù)修改數(shù)據(jù)模型酱吝、新增數(shù)據(jù)模型等問(wèn)題引起的數(shù)據(jù)庫(kù)遷移問(wèn)題給開(kāi)發(fā)工作帶來(lái)很多不必要的工作;尤其有未解除過(guò)該技術(shù)的新人加入土思。

  • Pod 添加 MagicalRecord 依賴庫(kù)之后务热,文件創(chuàng)建 - 數(shù)據(jù)實(shí)體創(chuàng)建 - 數(shù)據(jù)遷移 :

新建工程 ,Use Core Data 可選可不選己儒,這就給未勾選該項(xiàng)的舊工程使用 Core Data 技術(shù)提供可能


cd0.png

創(chuàng)建 .xcdatamodeld 文件


cd1.png

創(chuàng)建實(shí)體崎岂、新增屬性


cd2.png

創(chuàng)建實(shí)體相應(yīng)的關(guān)聯(lián)文件


cd3.png

數(shù)據(jù)庫(kù)遷移步驟 1


cd4.png

數(shù)據(jù)庫(kù)遷移步驟 2


cd5.png

緩存系統(tǒng)

APP緩存系統(tǒng)設(shè)計(jì)簡(jiǎn)要記錄(整理中)
HybridAPP(整理優(yōu)化中)

  • 對(duì)大多數(shù) APP 而言,都是 Hybrid 開(kāi)發(fā)闪湾,Web 頁(yè)與原生同時(shí)存在冲甘,其中 Web 頁(yè)可能是 UIWeb 也可能是 WKWeb 。所以與之相應(yīng)的緩存系統(tǒng)响谓,應(yīng)該包括 Web 緩存與 原生接口數(shù)據(jù)緩存兩部分。

  • Web 緩存有網(wǎng)絡(luò)緩存及 Webkit 框架機(jī)制內(nèi)的緩存省艳。這里也可以依據(jù) URL + 時(shí)間戳 自行設(shè)計(jì)一套緩存娘纷。

  • 原生接口部分的數(shù)據(jù)緩存

    1. 與用戶相關(guān)的信息、單個(gè)標(biāo)記符標(biāo)識(shí)等常采用沙盒存儲(chǔ)跋炕。
    2. 全局使用到的數(shù)據(jù)模型赖晶,需要永久存儲(chǔ)的話可以考慮歸檔;例如用戶登陸后的個(gè)人信息數(shù)據(jù)模型辐烂。
    3. 倘若不涉及大規(guī)模數(shù)據(jù)的增刪改查等操作遏插,可以考慮文件讀寫(xiě)的方式直接存儲(chǔ)網(wǎng)絡(luò)返回的 JSON 對(duì)象,借助 YYCache 亦可實(shí)現(xiàn)高性能存儲(chǔ)纠修。
    4. 大規(guī)模數(shù)據(jù)的存儲(chǔ)例如帖子胳嘲、評(píng)論、新聞扣草、外賣(mài)了牛、商品等可以考慮使用數(shù)據(jù)庫(kù):FMDB (DataStoreDemo - JXFMDBMOperator)或 Core Data (推薦使用 CoreData 的封裝庫(kù) MagicalRecord)颜屠;也可以簡(jiǎn)單點(diǎn)直接使用 NSPredicate 對(duì)數(shù)據(jù)的篩查操作,簡(jiǎn)單直接鹰祸。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甫窟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛙婴,更是在濱河造成了極大的恐慌粗井,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件街图,死亡現(xiàn)場(chǎng)離奇詭異浇衬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)台夺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)径玖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颤介,你說(shuō)我怎么就攤上這事梳星。” “怎么了滚朵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵冤灾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辕近,道長(zhǎng)韵吨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任移宅,我火速辦了婚禮归粉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漏峰。我一直安慰自己糠悼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布浅乔。 她就那樣靜靜地躺著倔喂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪靖苇。 梳的紋絲不亂的頭發(fā)上席噩,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音贤壁,去河邊找鬼悼枢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脾拆,可吹牛的內(nèi)容都是我干的萧芙。 我是一名探鬼主播给梅,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼双揪!你這毒婦竟也來(lái)了动羽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渔期,失蹤者是張志新(化名)和其女友劉穎运吓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疯趟,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拘哨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了信峻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倦青。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盹舞,靈堂內(nèi)的尸體忽然破棺而出产镐,到底是詐尸還是另有隱情,我是刑警寧澤踢步,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布癣亚,位于F島的核電站,受9級(jí)特大地震影響获印,放射性物質(zhì)發(fā)生泄漏述雾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一兼丰、第九天 我趴在偏房一處隱蔽的房頂上張望玻孟。 院中可真熱鬧,春花似錦鳍征、人聲如沸黍翎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玩敏。三九已至斗忌,卻和暖如春质礼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背织阳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工眶蕉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唧躲。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓造挽,卻偏偏與公主長(zhǎng)得像碱璃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饭入,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,938評(píng)論 2 89
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,392評(píng)論 8 265
  • 移動(dòng)開(kāi)發(fā)嵌器,數(shù)據(jù)存儲(chǔ)是一定而且經(jīng)常遇到的,存儲(chǔ)的數(shù)據(jù)有大有小谐丢,大數(shù)據(jù)和小數(shù)據(jù)的存儲(chǔ)方式也不一樣爽航,存儲(chǔ)數(shù)據(jù)也要考慮性能...
    TigerManBoy閱讀 5,201評(píng)論 2 5
  • 每個(gè)人都受利益的驅(qū)使,為了保全自己乾忱,為了得到更多讥珍,不近情理合乎利益。 我是個(gè)很蠢的人窄瘟,在別人需要幫助的時(shí)候我會(huì)挺身...
    lMs拙閱讀 278評(píng)論 0 0
  • 【一】 那時(shí)候的我像個(gè)傻瓜衷佃。 穿著繼母破舊的大棉襖,將瘦小的身軀包裹的密不透風(fēng)蹄葱,圍著一條已辯不出顏色的舊式圍巾氏义,站...
    花曉熙閱讀 704評(píng)論 1 10