iOS開發之資料訪問(三) FMDB

2021-06-27 15:59:11 字數 3598 閱讀 9361

fmdb

基本使用

相比於sqlite3來說core data存在著諸多優勢,它物件導向,開發人員不必過多的關心更多資料庫操作知識,同時它基於objc操作,書寫更加優雅等。但是它本身也存在著一定的限制,例如如果考慮到跨平台,則只能選擇sqlite,因為無論是ios還是android都可以使用同乙個資料庫,降低了開發成本和維護成本。其次是當前多數orm框架都存在的效能問題,因為orm最終轉化為sql操作,其中牽扯到模型資料轉化,其效能自然比不上直接使用sql運算元據庫。那麼有沒有更好的選擇呢?答案就是對sqlite進行封裝。

其實通過前面對於sqlite的分析,大家應該已經看到kcdbmanager就是對於sqlite封裝的結果,開發人員面對的只有sql和objc方法,不用過多libsqlite3的c語言api。但它畢竟只是乙個簡單的封裝,還有更多的細節沒有考慮,例如如何處理併發安全性,如何更好的處理事務等。因此,這裡推薦使用第三方框架fmdb,整個框架非常輕量級但又不失靈活性,也是很多企業開發的首選。

1.fmdb既然是對於libsqlite3框架的封裝,自然使用起來也是類似的,使用前也要開啟乙個資料庫,這個資料庫檔案存在則直接開啟否則會建立並開啟。這裡fmdb引入了乙個mfdatabase物件來表示資料庫,開啟資料庫和後面的資料庫操作全部依賴此物件。下面是開啟資料庫獲得mfdatabase物件的**:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

-(void)opendb:(nsstring *)dbnameelse

}

注意:datawithpath中的路徑引數一般會選擇儲存到沙箱中的documents目錄中;如果這個引數設定為nil則資料庫會在記憶體中建立;如果設定為@」」則會在沙箱中的臨時目錄建立,應用程式關閉則檔案刪除。

2.對於資料庫的操作跟前面kcdbmanager的封裝是類似的,在fmdb中fmdatabase類提供了兩個方法executeupdate:和executequery:分別用於執行無返回結果的查詢和有返回結果的查詢。當然這兩個方法有很多的過載這裡就不詳細解釋了。唯一需要指出的是,如果呼叫有格式化引數的sql語句時,格式化符號使用「?」而不是「%@」、等。下面是兩種情況的**片段:

a.無返回結果

1

2

3

4

5

6

-(void)executenonquery:(nsstring *)sql

}

b.有返回結果

1

2

3

4

5

6

7

8

9

10

11

12

13

-(nsarray *)executequery:(nsstring *)sql

[array addobject:dic];

}

returnarray;

}

對於有返回結果的查詢而言,查詢完返回乙個游標fmresultset,通過遍歷游標進行查詢。而且fmdb中提供了大量intforcolumn、stringforcolumn等方法進行取值。

併發和事務

我們知道直接使用libsqlite3進行資料庫操作其實是執行緒不安全的,如果遇到多個執行緒同時操作乙個表的時候可能會發生意想不到的結果。為了解決這個問題建議在多執行緒中使用fmdatabasequeue物件,相比fmdatabase而言,它是執行緒安全的。

建立fmdatabasequeue的方法是類似的,呼叫databasequeuewithpath:方法即可。注意這裡不需要呼叫開啟操作。

1

2

3

4

5

6

7

8

-(void)opendb:(nsstring *)dbname

然後所有的增刪改查操作呼叫fmdatabasequeue的indatabase:方法在block中執行操作sql語句即可。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

-(void)executenonquery:(nsstring *)sql];

}

-(nsarray *)executequery:(nsstring *)sql

[array addobject:dic];

}

}];

returnarray;

}

之所以將事務放到fmdb中去說並不是因為只有fmdb才支援事務,而是因為fmdb將其封裝成了幾個方法來呼叫,不用自己寫對應的sql而已。其實在在使用libsqlite3運算元據庫時也是原生支援事務的(因為這裡的事務是基於資料庫的,fmdb還是使用的sqlite資料庫),只要在執行sql語句前加上「begin transaction;」執行完之後執行「commit transaction;」或者「rollback transaction;」進行提交或回滾即可。另外在core data中大家也可以發現,所有的增、刪、改操作之後必須呼叫上下文的儲存方法,其實本身就提供了事務的支援,只要不呼叫儲存方法,之前所有的操作是不會提交的。在fmdb中fmdatabase有begintransaction、commit、rollback三個方法進行開啟事務、提交事務和回滾事務。

IOS開發 FMDB備忘

增 四種方式向資料表中插入資料 cpp view plain copy print?1 dbhelper sharedhelper db executeupdate insert into tb test username,values lizhongfu male 2 dbhelper share...

iOS開發 FMDB使用

demo位址 nslog path database fmdatabase alloc initwithpath path id欄位為自增欄位 name char 256位 age char 3位 char 2位 phone char 13位 address char 100位的 if databa...

iOS 資料持久化之FMDB

新建乙個專案名為qzfmdb,開啟終端 cd users hongde desktop qzfmdb vim podfile鍵盤敲 i 輸入 target qzfmdb dopod jqfmdb end wq 回車鍵 pod install關掉專案 重新開啟qzfmdb.xcworkspace vi...