一.數(shù)據(jù)持久化是什么?用來干什么?
數(shù)據(jù)持久化是一種非易失性存儲技術,再重啟計算機或者設備的后也不會丟失數(shù)據(jù),是將內存中的數(shù)據(jù)模型轉換成存儲模型,以及將存儲模型轉換為內存中的數(shù)據(jù)模型的統(tǒng)稱。數(shù)據(jù)模型可以是任何數(shù)據(jù)結構或對象模型,存儲模型可以使關系模型,XML,二進制流等。持久化技術主要用于MVC模型中的model層?,F(xiàn)在的數(shù)據(jù)持久化有下面幾種技術:
二.NSUserDefaults(關鍵詞:屬性列表、xml序列化)
1.NSUserDefaults是蘋果基于屬性列表(plist文件)所封裝的一個單例類,該類提供了基本數(shù)據(jù)類型的plist文件存儲方法。
以下是我們項目中搜索所用到的NSUserDefaults的用法



2.簡單總結一下NSUserDefaults常用方法(偽代碼)
/// 從NSUserDefaults中取出key值所對應的Value,id可以是NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL等基本數(shù)據(jù)類型
id=[[NSUserDefaults standardUserDefaults] objectForKey:(NSString *)];
/// 將數(shù)據(jù)對象存儲到NSUserDefaults中
[[NSUserDefaults standardUserDefaults] setObject:idforKey:(NSString *)];
/// 將數(shù)據(jù)對象從NSUserDefaults中移除
[[NSUserDefaults standardUserDefaults] removeObjectForKey:(NSString *)];
/// 同步更新到Plist文件,當修改NSUserDefaults的數(shù)據(jù)后,必須進行此步操作同步數(shù)據(jù)
[[NSUserDefaults standardUserDefaults] synchronize];
3.NSUserDefaults特點
(1)NSUserDefaults常用于存儲OC的基本數(shù)據(jù)類型,不適合存儲自定義對象
NSUserDefaults支持的數(shù)據(jù)類型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL
(2)自定義對象可以轉化成基本類型NSData后在使用NSUserDefaults進行存儲,但并不常用
(3)當plist文件存儲的數(shù)據(jù)發(fā)生改變(寫操作)時,需要調用synchronize方法同步,否則數(shù)據(jù)無法同步保存
(4)Key值應具有唯一性,重名時覆蓋先前的key值
(5)實際開發(fā)中,NSUserDefaults常用語存儲配置信息,優(yōu)點是簡便,缺點是所有數(shù)據(jù)都是以明文存儲在plist文件中,容易被解讀安全性不高
4.NSUserDefaults存儲的對象全是不可變的
假如,我想存儲一個NSMutableArray的對象,我必須先創(chuàng)建一個不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去
取出數(shù)據(jù)也是一樣的,想要用NSUserDefaults中的數(shù)據(jù)給可變數(shù)組賦值,先給出一個錯誤的寫法

正確的寫法

三.對象歸檔(關鍵詞:序列化)
1.什么是對象歸檔
和屬性列表一樣,對象歸檔也是將對象寫入文件存入硬盤內,本質上也是另外一種序列化(存儲模型不同)。歸檔與屬性列表方式不同,屬性列表只有指定的一些對象才能進行持久化且明文存儲,而歸檔時任何實現(xiàn)了NSCoding協(xié)議的對象都可以被持久化,且歸檔后的文件是加密的。對象歸檔涉及兩個類:NSKeyedArchiver和NSKeyedUnarchiver,這兩個類是NSCoder的子類,分別用于歸檔以及解檔。例如,現(xiàn)在項目中存儲的用戶信息實體使用的是歸檔的方法,以下是自己寫的一個小demo,附上代碼:


這個Person類就具有了歸檔與解檔能力,當你需要對一個Person類的實力對象進行儲存或者解析時,在你自己的方法中只要鍵入如下代碼即可,下面兩個方法對應兩個按鈕的回調,點擊按鈕時分別執(zhí)行person對象的歸檔和解檔

獲取Document目錄

避免文件和數(shù)據(jù)被同步到iCloud和iTunes

四.CoreData(關鍵詞:集成化)
1.什么場景需要用到coreData
當你的應用程序需要在本地存儲大量的關系數(shù)據(jù)模型時,顯然上訴方法都不適用,因為不論對象歸檔還是數(shù)據(jù)列表,一旦數(shù)據(jù)模型之間存在依賴關系,問題就將變得復雜。而此時iPhone自帶的輕量級數(shù)據(jù)庫Sqlite便成為我們的首選,如果你熟悉數(shù)據(jù)庫,那么coreData也將不在神秘,你可以理解為它是Sqlite封裝的一個框架,你可以在Xcode中進行Sqlite數(shù)據(jù)庫的可視化操作。
2.下面是coreData的使用方法



3.現(xiàn)在用代碼實現(xiàn)數(shù)據(jù)的增刪查找,下面是幾個核心類

4.為什么要使用coreData
(1)coreData脫離了sql語句,集成化更高。
(2)coreData對版本遷移支持比較好,App升級后數(shù)據(jù)庫字段或者表有更改會導致crash,CoreData的版本管理和數(shù)據(jù)遷移變得非常有用,手動寫sql語句操作相對麻煩一些。
(3)coreData不光能操縱SQLite,coreData和iCloud的結合也很好,如果有這方面需求的話優(yōu)先考慮coreData
(4)coreData是支持多線程的,但需要thread confinement的方式實現(xiàn),使用了多線程之后可以最大化的防止阻塞主線程
5.coreData數(shù)據(jù)遷移
(1)點中coreData里面隨便一個數(shù)據(jù)庫然后Editor->Add Model Version然后Finish

(2)然后把最右邊的Model Version Current改為新建的Model

(3)在xcdatamodeld相同的文件夾目錄下,“New File” ->"Core Data"->"Mapping Model"

(4)選擇需要Mapping的源數(shù)據(jù)庫

(5)再選擇目標數(shù)據(jù)庫

(6)接著命名一下Mapping Model文件的名字(名字最好能一眼看上去就能區(qū)分出是哪個數(shù)據(jù)庫的版本升級上來的,這里我寫的就是ModelV2ToV3,這樣一看就知道是V2到V3的升級)

(7)Mapping文件打開
Mapping文件打開對應的就是Source源實體屬性,遷移到Target目標實體屬性的映射,上面是屬性,下面是關系的映射。$source就是代表的源實體

舉個例子吧,假設我最初有一張很抽象的表,叫Object表,用來存儲東西的一些屬性,里面假設有name,width,height。突然我有一天有新需求了,需要在Object表里面新增幾個字段,比如說colour,weight等,由于這個都是簡單的新增,不涉及到數(shù)據(jù)的轉移,這時候用輕量級遷移就可以了。
6.手動創(chuàng)建CoreData,創(chuàng)建步驟如下
1.創(chuàng)建模型文件【相當于一個數(shù)據(jù)庫】
2.添加實體【一張表】
3.創(chuàng)建實體類【相當模型--表結構】
4.生成上下文 關聯(lián)模型文件生成數(shù)據(jù)庫
7.創(chuàng)建上下文和關聯(lián)數(shù)據(jù)庫之間我們先來看看相對應的關系依賴圖




從上面可以看出,我們使用coreData會有很多的配置代碼;下面我們可以在以下關于coreData的第三方庫MagicRecord
五.MagicRecord
1.MagicRecord是對CoreData的深度封裝,我們用pod導入MagicRecord后,導入MagicRecord后,我們不需要在寫上面CoreData步驟7的代碼,只需要在APPDelegate文件里面寫上下面這行代碼

2.按照CoreData創(chuàng)建數(shù)據(jù)庫和表的順序創(chuàng)建好我們需要的實體

3.在ViewController里面


六.Sqlite
1、新建項目sqliteDemo,添加使用sqlite的庫libsqlite3.0.tbd

2.在ViewController里面的ViewDidLoad里面獲取documents目錄,將數(shù)據(jù)庫文件放在沙盒目錄下的Documents下

注:寫完上面代碼后,我們可以打印出paths的路徑,然后在Finder里面點擊(command+shift+g)查看我們建好的數(shù)據(jù)庫文件



這個文件可以用火狐的Sqlite manager插件打開(這個鏈接講解了SQLite Manager的使用方法http://www.hangge.com/blog/cache/detail_766.html)(這張圖是我創(chuàng)建好數(shù)據(jù)庫后插入數(shù)據(jù)后的表)

3.創(chuàng)建 表格,創(chuàng)建了一張名為PERSIONINFO的數(shù)據(jù)庫表,其中有一個自增的ID,和NAME,AGE,SEX,WEIGTH,ADDRESS五個屬性

4.插入數(shù)據(jù)

5.查詢數(shù)據(jù)

6.修改數(shù)據(jù)

7.刪除數(shù)據(jù)

8.總結:實際開發(fā)涉及的sql語句會比這個麻煩(這是最簡單的sqlite創(chuàng)建和使用),而且SQLite3的使用是比較麻煩的,因為都是些C語言的函數(shù),理解起來困難。不過一般開發(fā)過程中,使用的都是第三方開源庫FMDB,封裝了這些基本的C語言方法,使得我們在使用時更加容易理解,提交開發(fā)效率。
七.FMDB
1.FMDB是iOS平臺的SQLite數(shù)據(jù)庫框架,它是以OC的方式封裝了SQLite的C語言API,它相對于cocoa自帶的C語言框架有如下的有點:
(1)使用起來更加面向對象,省去了很多麻煩,冗余的C語言代碼
(2)對比蘋果自帶的Core Data框架,更加輕量級和靈活
(3)提供了多線程安全的數(shù)據(jù)庫操作方法,有效地防止數(shù)據(jù)混亂
2.核心類
FMDB有三個主要的類
(1)FMDatabase
一個FMDatabase對象就代表一個單獨的SQLite數(shù)據(jù)庫,用來執(zhí)行SQL語句
(2)FMResultSet
使用FMDatabase執(zhí)行查詢后的結果集
(3)FMDatabaseQueue
用于在多線程中只想多個查詢或更新,它是線程安全的
3.打開數(shù)據(jù)庫
(1)和c語言框架一樣,F(xiàn)MDB通過指定SQLite數(shù)據(jù)庫文件路徑來創(chuàng)建FMDatabase對象,但FMDB更加容易理解,使用起來更加容易,使用之前一樣需要導入sqlite3.dylib。打開數(shù)據(jù)庫方法如下:

(2)創(chuàng)建student表

(3)插入數(shù)據(jù)

(4)查詢所有數(shù)據(jù)

(5)根據(jù)dbid 查詢數(shù)據(jù)

(6)根據(jù)dbid 更新數(shù)據(jù)

(7)根據(jù)dbid刪除數(shù)據(jù)

(8)刪除所有數(shù)據(jù)

(9)刪除student表

(10)升級表,數(shù)據(jù)庫遷移

