數(shù)據(jù)持久化

一.數(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ù)庫遷移

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容