種類:
? ? ?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ù)遷移處理
刪除備份表