前言
SQLite (http://www.sqlite.org/docs.html) 是一個輕量級的關(guān)系數(shù)據(jù)庫剩盒。iOS SDK 很早就支持了 SQLite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 頭文件即可猖败。但是没隘,原生的 SQLite API 在使用上相當不友好,在使用時窘奏,非常不便嘹锁。于是,開源社區(qū)中就出現(xiàn)了一系列將 SQLite API 進行封裝的庫着裹,而 FMDB (https://github.com/ccgus/fmdb) 則是開源社區(qū)中的優(yōu)秀者领猾。
FMDB 在使用上相當方便。以下是一個簡單的例子:
可以看到骇扇,使用 FMDB 后的數(shù)據(jù)庫代碼清晰明了摔竿,比原生的 API 優(yōu)雅多了。另外少孝,F(xiàn)MDB 同時兼容 ARC 和非 ARC 工程继低,會自動根據(jù)工程配置來調(diào)整相關(guān)的內(nèi)存管理代碼。
使用說明
該使用說明主要翻譯自 fmdb 的 github 項目說明文檔:https://github.com/ccgus/fmdb
引入相關(guān)文件
首先將 FMDB 從 github 上 clone 下來韭山,然后將以下文件 copy 到你的工程中:
建立數(shù)據(jù)庫
建立數(shù)據(jù)庫只需要如下一行即可 , 當該文件不存在時郁季,fmdb 會自己創(chuàng)建一個。如果你傳入的參數(shù)是空串:@“” 钱磅,則 fmdb 會在臨時文件目錄下創(chuàng)建這個數(shù)據(jù)庫梦裂,如果你傳入的參數(shù)是 NULL,則它會建立一個在內(nèi)存中的數(shù)據(jù)庫盖淡。
FMDatabase*db=[FMDatabasedatabaseWithPath:@"/tmp/tmp.db"];
打開數(shù)據(jù)庫
使用如下語句年柠,如果打開失敗,可能是權(quán)限不足或者資源不足褪迟。通常打開完操作操作后冗恨,需要調(diào)用 close 方法來關(guān)閉數(shù)據(jù)庫。
執(zhí)行更新操作
除了 Select 操作之外味赃,其它的都是更新操作掀抹。更新操作使用如下方法,如果有錯誤心俗,可以用 error 參數(shù)中獲得傲武。
-[FMDatabaseexecuteUpdate:error:withArgumentsInArray:orVAList:]
執(zhí)行查詢操作
查詢操作示例如下蓉驹。注意:即使操作結(jié)果只有一行,也需要先調(diào)用 FMResultSet 的 next 方法揪利。
FMDB 提供如下多個方法來獲取不同類型的數(shù)據(jù):
通常情況下态兴,你并不需要關(guān)閉 FMResultSet,因為相關(guān)的數(shù)據(jù)庫關(guān)閉時疟位,F(xiàn)MResultSet 也會被自動關(guān)閉瞻润。
數(shù)據(jù)參數(shù)
通常情況下,你可以按照標準的 SQL 語句甜刻,用 ? 表示執(zhí)行語句的參數(shù)绍撞,如:
INSERTINTOmyTableVALUES(?,?,?)
然后,可以我們可以調(diào)用 executeUpdate 方法來將 ? 所指代的具體參數(shù)傳入罢吃,通常是用變長參數(shù)來傳遞進去的楚午,如下:
NSString*sql=@"insert into User (name, password) values (?, ?)";[dbexecuteUpdate:sql,user.name,user.password];
這里需要注意的是昭齐,參數(shù)必須是 NSObject 的子類尿招,所以象 int,double,bool 這種基本類型,需要封裝成對應(yīng)的包裝類才行阱驾,如下所示:
線程安全
如果我們的 app 需要多線程操作數(shù)據(jù)庫就谜,那么就需要使用 FMDatabaseQueue 來保證線程安全了。 切記不能在多個線程中共同一個 FMDatabase 對象并且在多個線程中同時使用里覆,這個類本身不是線程安全的丧荐,這樣使用會造成數(shù)據(jù)混亂等問題。
使用 FMDatabaseQueue 很簡單喧枷,首先用一個數(shù)據(jù)庫文件地址來初使化 FMDatabaseQueue虹统,然后就可以將一個閉包 (block) 傳入 inDatabase 方法中。 在閉包中操作數(shù)據(jù)庫隧甚,而不直接參與 FMDatabase 的管理车荔。
工具
為了查看 Sqlite 中的數(shù)據(jù),一個好的圖形化界面的數(shù)據(jù)庫管理程序是必不可少的戚扳。mysql 有 phpMyAdmin忧便,那么 sqlite 呢?
我主要使用的是 Firefox 的一個名為 SQLite Manager 的插件帽借,安裝此插件后珠增,可以直接打開后綴名為 sqlite 的數(shù)據(jù)庫文件。SQLite Manager 提供一個圖形化的界面來執(zhí)行數(shù)據(jù)查詢或更改操作砍艾。如下圖所示:
總結(jié)
FMDB 將 SQLite API 進行了很友好的封裝蒂教,使用上非常方便,對于那些使用純 Sqlite API 來進行數(shù)據(jù)庫操作的 app脆荷,可以考慮將其遷移到基于 FMDB 上凝垛,這對于以后數(shù)據(jù)庫相關(guān)功能的開發(fā)維護,可以提高不少效率。
大數(shù)據(jù)量苔严,高并發(fā)時定枷,通常使用sqlite3作為數(shù)據(jù)庫;而使用fmdb管理更加簡單有效届氢!