iOS: 數(shù)據(jù)持久化方案

種類:

? ? ?plist存儲:使用XML鍵值對持久化,它適用于少量且數(shù)據(jù)基本不怎么改變的情況。

? ? ? ? 偏好存儲:使用NSUserDefalut持久化,專門用來保存應(yīng)用程序的配置信息的,一般不要在偏好設(shè)置中保存其他數(shù)據(jù)。

? ? ? ? 歸檔序列化存儲:使用二進(jìn)制序列化持久化,只要遵循了NSCoding協(xié)議的對象都可以通過它實現(xiàn)序列化。

? ? ? ? 沙盒存儲:持久化在Document目錄下,一般持久化一些文件,比如圖片,音頻,視頻等,文件沙盒存儲主要存儲非機(jī)密數(shù)據(jù)。

? ? ? ? 本地數(shù)據(jù)庫存儲:適合儲存大規(guī)模數(shù)據(jù),管理方便,不過操作稍微復(fù)雜一些。

三、詳解:

1、plist存儲

定義:

  plist文件,即屬性列表文件,全名是Property List,這種文件的擴(kuò)展名為.plist,因此,通常被叫做plist文件。

作用:

  它是一種用來存儲串行化后的對象的文件,在iOS開發(fā)中通常用來存儲用戶設(shè)置,還可以用于存儲程序中經(jīng)常用到而不經(jīng)常改動的數(shù)據(jù)。

問題:

(1)什么數(shù)據(jù)適合存儲?

  能存儲NSString、NSArray、NSDictionary、NSData、NSDate、NSNumber、Boolean不能存儲自定義對象

(2)存到什么地方?

  ?寫入創(chuàng)建的.plist文件中

(3)使用場景?

  plist常用于存儲長時間不容易發(fā)生變化的數(shù)據(jù),例如省市列表、車輛名稱列表之類的數(shù)據(jù)等,這些數(shù)據(jù)可以保存在 plist 文件里,所以plist適用于存儲小型數(shù)據(jù),不推薦用plist做緩沖。 ? ? ? ?

(5)有什么缺點?

? ? ? ? ??因為所有的數(shù)據(jù)都放在root dictionary里,每次讀取都要把整個root dictionary取出來再取需要的對象.如果plist文件緩存了幾十M的數(shù)據(jù).這樣很費內(nèi)存和時間。

2、偏好存儲

定義:

  User Defaults 顧名思義就是一個用戶為系統(tǒng)以及程序設(shè)置的默認(rèn)值。

  每個用戶都有自己的一套數(shù)據(jù),用戶和用戶之間沒法共享的。在蘋果的API中,提供了一個類去存儲用戶的偏好設(shè)置。

  這個方法推薦只存儲用戶的偏好設(shè)置,不要存儲一些字典、數(shù)組之類的。

作用:

  很多iOS應(yīng)用都支持偏好設(shè)置,比如保存用戶名、密碼、字體大小等設(shè)置。

iOS提供了一套標(biāo)準(zhǔn)的解決方案來為應(yīng)用加入偏好設(shè)置功能,就是每一個app都有一個plist文件專門用以保存偏好設(shè)置數(shù)據(jù)。

  每個應(yīng)用都有個NSUserDefaults實例,通過它來存取偏好設(shè)置。

問題:

(1)什么數(shù)據(jù)適合存儲?

  可以存儲OC定義的所有數(shù)據(jù)類型,包括對象(系統(tǒng)和自定義的)類型、基本數(shù)據(jù)類型,如NSInteger等。

(2)存到什么地方?

  NSUserDefault 本地保存的位置是Library/Preferences 這個目錄下的 plist 文件。

(3)使用場景? ? ? ? ? ??

在App中,有時候我們需要將一些信息進(jìn)行短期的保存,方便用戶下次更方便使用App,減少多余的操作,增強(qiáng)用戶體驗。

比如,保存用戶名、字體大小、是否自動登錄等。

(5)注意事項?

偏好設(shè)置是專門用來保存應(yīng)用程序的配置信息的, 一般情況不要在偏好設(shè)置中保存其他數(shù)據(jù)。

如果利用系統(tǒng)的偏好設(shè)置來存儲數(shù)據(jù), 默認(rèn)就是存儲在Preferences文件夾下面的,偏好設(shè)置會將所有的數(shù)據(jù)都保存到同一個文件中。

使用偏好設(shè)置對數(shù)據(jù)進(jìn)行保存之后, 它保存到系統(tǒng)的時間是不確定的,會在將來某一時間點自動將數(shù)據(jù)保存到Preferences文件夾下面,如果需要即刻將數(shù)據(jù)存儲,可以使用[defaults synchronize];

所有的信息都寫在一個文件中,對比簡單的plist可以保存和讀取基本的數(shù)據(jù)類型。

不支持自定義對象的存儲.

使用注意點:

NSUserDefaults存儲的數(shù)據(jù)都是不可變的,想將可變數(shù)據(jù)存入需要先轉(zhuǎn)為不可變才可以存儲.

NSUserDefaults是定時把緩存中的數(shù)據(jù)寫入磁盤的,而不是即時寫入,為了防止在寫完NSUserDefaults后程序退出導(dǎo)致的數(shù)據(jù)丟失,可以在寫入數(shù)據(jù)后使用synchronize強(qiáng)制立即將數(shù)據(jù)寫入磁盤.

3、歸檔序列化存儲

定義:

? ? ? ? ?對象歸檔是iOS中數(shù)據(jù)持久化的一種方式。?歸檔是指另一種形式的二進(jìn)制序列化,但它是任何對象都可以實現(xiàn)的更常規(guī)的類型。

作用:

? ? ? ? ?使用對模型對象進(jìn)行歸檔的技術(shù)可以輕松將復(fù)雜的對象寫入文件,然后再從中讀取它們

3、歸檔序列化存儲?NSKeyedArchiver

定義:

? ? ? ? ?對象歸檔是iOS中數(shù)據(jù)持久化的一種方式。?歸檔是指另一種形式的二進(jìn)制序列化,但它是任何對象都可以實現(xiàn)的更常規(guī)的類型。

作用:

? ? ? ? ?使用對模型對象進(jìn)行歸檔的技術(shù)可以輕松將復(fù)雜的對象寫入文件,然后再從中讀取它們。

問題:

(1)什么數(shù)據(jù)適合存儲?

?  ?要使用對象歸檔,則歸檔的對象所屬類中實現(xiàn)的每個屬性都是標(biāo)量,或者都是遵循NSCoding協(xié)議和NSCopying協(xié)議的某個類的實例對象。

(2)存到什么地方?

   ?對象歸檔后將得到一個后綴為.archive的文件,數(shù)據(jù)就保存在了這個文件中。

(3)使用場景?

   ?定義某個實例,如果需要持久化該實例從而方便以后使用它的屬性值,同時可以隨意更改該實例的屬性值,推薦在給實例初始化的同時直接使用歸檔進(jìn)行存儲。 ? ? ?

(5)有什么缺點?

? ? ? ? ? 當(dāng)待存儲的實例具有成百上千個屬性的時候,單純的一個個去序列化屬性值耗時又費力。(當(dāng)然可以借助runtime機(jī)制解決這個缺點,MJExtension這個框架就是這個原理)?

4、Document沙盒存儲

定義:? ? ?

? ? ? ? ??每個iOS應(yīng)用都有自己的應(yīng)用沙盒(應(yīng)用沙盒就是文件系統(tǒng)目錄),與其他文件系統(tǒng)隔離。

? ? ? ? ? 應(yīng)用必須待在自己的沙盒里,其他應(yīng)用不能訪問該沙盒。

? ? ? ? ? 沙盒的本質(zhì)就是一個文件夾,名字是隨機(jī)分配的。

目錄:

Application:存放程序源文件,上架前經(jīng)過數(shù)字簽名,上架后不可修改。

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

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

Library/Caches: 保存應(yīng)用運行時?成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時不會備份 該目錄。?一般存儲體積大、不需要備份的非重要數(shù)據(jù),比如網(wǎng)絡(luò)數(shù)據(jù)緩存存儲到Caches下

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

// 獲取程序的Home目錄 NSString *path = NSHomeDirectory();?

?// 獲取Document目錄 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) fristObject];

? ? // 獲取Cache目錄? ? ? NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) fristObject];? ?

? ? // 獲取Library目錄? ? ? NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) fristObject];?

// 獲取Tmp目錄? ? ? NSString *path = NSTemporaryDirectory();

作用:

? ? ? ? 用來存儲和備份稍微較大的不是很重要的數(shù)據(jù),比如緩存圖片、音頻、視頻等,最典型的SDWebImage緩存圖片的框架。

? ? ? ? 當(dāng)然緩存的時間長短根據(jù)開發(fā)者選擇持久化的目錄路徑有關(guān)。

問題:

(1)什么數(shù)據(jù)適合存儲?

   ?圖片、音頻、視頻、文本等

(2)存到什么地方?

   ?寫入創(chuàng)建的.txt、.data等任意擴(kuò)展名的文件中

(3)使用場景?

   ?當(dāng)App中涉及到電子書閱讀、聽音樂、看視頻、刷圖片列表等時,推薦使用沙盒存儲。

   ?因為這可以極大的節(jié)約用戶流量,而且也增強(qiáng)了app的體驗效果。

主要步驟

根據(jù)這個思路,分析了一下數(shù)據(jù)庫升級了主要步驟大概如下:

獲取數(shù)據(jù)庫中舊的表

修改表名,添加后綴“_bak”,把舊的表當(dāng)做備份表

創(chuàng)建新的表

獲取新創(chuàng)建的表

遍歷舊的表和新表,對比取出需要遷移的表的字段

數(shù)據(jù)遷移處理

刪除備份表

?FMDBMigrationManager

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