首先我們拋出來兩個問題:1.什么是數(shù)據(jù)持久化數(shù)?2.據(jù)持久化都有哪些方法?接下來我們順著思路,來解決這兩個問題。
1.什么是數(shù)據(jù)持久化
從字面意思上理解,我們便知道,數(shù)據(jù)持久化是實現(xiàn)我們數(shù)據(jù)的長久儲存,以便于我們在請求數(shù)據(jù)的時候能夠更快速,更節(jié)省流量。從技術(shù)層面說,數(shù)據(jù)持久化就是將內(nèi)存中的數(shù)據(jù)模型轉(zhuǎn)換為存儲模型,以及將存儲模型轉(zhuǎn)換為內(nèi)存中的數(shù)據(jù)模型的統(tǒng)稱. 數(shù)據(jù)模型可以是任何數(shù)據(jù)結(jié)構(gòu)或?qū)ο竽P?存儲模型可以是關(guān)系模型、XML、二進(jìn)制流等。
換種說法:數(shù)據(jù)持久化就是將輸入或網(wǎng)絡(luò)請求的數(shù)據(jù)按照一定的方式存儲在本地磁盤,并在需要時將磁盤中的數(shù)據(jù)按照特定方式取出顯示在視圖上的,可以將數(shù)據(jù)長期(永久)保存持有的行為。
2.數(shù)據(jù)持久化方法
實現(xiàn)數(shù)據(jù)持久化的方法各種各樣,我們下面總結(jié)和舉出幾種常用和基礎(chǔ)的數(shù)據(jù)持久化方式。
2.1、通過oc語言方式存儲
存入:
首先,獲取library路徑,
其次,通過單例NSFileManager文件管理器創(chuàng)建文件并返回文件(數(shù)據(jù)所存入文件)路徑
最后,通過writeToFile(例)方法將內(nèi)容寫入文件
取出:
首先,獲取內(nèi)容文件所在路徑
然后,根據(jù)路徑獲取文件內(nèi)容,并將內(nèi)容顯示(更新UI)
2.2、通過plist文件方式存儲
存入:
首先,獲取bundle路徑,并在其中通過單例NSFileManager文件管理器創(chuàng)建plist文件,返回文件路徑
其次,將數(shù)據(jù)放入字典或數(shù)組中通過writeToFile:(例)方法存入文件
取出:
首先,獲取內(nèi)容文件所在路徑
然后,根據(jù)路徑獲取文件內(nèi)容,并將內(nèi)容顯示(更新UI)
2.3、通過UserDefault方式存儲
NSUserDefaults是單例,同時也是線程安全的。
常用在鍵值存儲
NSUserDefaults類提供了一個與默認(rèn)系統(tǒng)進(jìn)行交互的編程接口。NSUserDefaults對象是用來保存,恢復(fù)應(yīng)用程序相關(guān)的偏好設(shè)置,配置數(shù)據(jù)等等。默認(rèn)系統(tǒng)允許應(yīng)用程序自定義它的行為去迎合用戶的喜好。你可以在程序運(yùn)行的時候從用戶默認(rèn)的數(shù)據(jù)庫中讀取程序的設(shè)置。同時NSUserDefaults的緩存避免了在每次讀取數(shù)據(jù)時候都打開用戶默認(rèn)數(shù)據(jù)庫的操作。可以通過調(diào)用synchronize方法來使內(nèi)存中的緩存與用戶默認(rèn)系統(tǒng)進(jìn)行同步。
NSUserDefaults支持的數(shù)據(jù)類型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL
存入:
獲取NSUserDefaults單例對象,通過setObjiect: forKey:(例)方法存入文件,并通過synchronize方法實現(xiàn)數(shù)據(jù)同步
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:name forKey:@"kName"]; [defaults setBool:isOpen forKey:@"kIsOpen"];
return [defaults synchronize];//同步數(shù)據(jù)
取出:
同樣獲取單例對象,通過objectForKey:方法獲取存儲內(nèi)容,并更新UI
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *name = [defaults objectForKey:@"kName"]; BOOL isOpen = [defaults boolForKey:@"kIsOpen"];
2.4、歸檔解檔
一般用在自定義對象
前提,可創(chuàng)建模型并在模型中實現(xiàn)歸檔方法(將對象通過編碼為二進(jìn)制,NSCoder例方法:encodeObject:forKey:)和解檔方法(將二進(jìn)制文件通過編碼成為數(shù)據(jù)對象,例方法:decodeObjectForKey:)
存入:(歸檔)
獲取bundle路徑,并在bundle中使用單例NSFileManager文件管理器創(chuàng)建存儲文件并返回路徑 然后,NSKeyedArchiver類利用帶鍵的文件來歸檔,類方法archiveRootObject:toFile:
取出:(解檔)
同樣先獲取文件路徑,然后用NSKeyedUnarchiver類類方法(unarchiveObjectWithFile:)將數(shù)據(jù)取出,并更新UI
2.5、c語言SQLite3和FMDB
都采用單例方式,把行為進(jìn)行封裝
都是在單例的初始化的時候創(chuàng)建數(shù)據(jù)庫對象,并且只執(zhí)行一次創(chuàng)建
創(chuàng)建時,首先獲取文件路徑,再通過SQL語句創(chuàng)建數(shù)據(jù)庫
在c語言中,一個完整的行為分為
1.打開數(shù)據(jù)庫 sqlite3_open
2.編寫sql語句
3.創(chuàng)建預(yù)編譯對象(如果有參數(shù),需要先綁定參數(shù),例:插入,查詢(部分),刪除,更新) sqlite3_stmt *stmt(預(yù)編譯對象)sqlite3_bind_text(綁定參數(shù))
4.執(zhí)行預(yù)編譯對象 sqlite3_step(stmt);
5.銷毀預(yù)編譯對象 sqlite3_finalize(stmt);
6.關(guān)閉數(shù)據(jù)庫 sqlite3_close(db)
FMDB對c語言中的數(shù)據(jù)庫操作行為,所以操作更為簡單和更易理解
常用在增刪改查
FMDatabase 數(shù)據(jù)庫對象類 用于執(zhí)行SQL語句
FMRrsultSet 結(jié)果集合類 用于接受數(shù)據(jù)庫隊列執(zhí)行后返回結(jié)果
FMDatabaseQueue 數(shù)據(jù)隊列類 在多線程中更新的話需要用到該類
1.打開數(shù)據(jù)庫 [db open];
2.編寫sql語句
3.執(zhí)行sql(數(shù)據(jù)庫對象(FMDateBase實例)執(zhí)行sql語句)
[db executeUpdate:sql];[(FMRrsultSet 實例) next]遍歷
4.關(guān)閉數(shù)據(jù)庫 [db close];