在iOS開發中使用FMDB

2021-07-30 07:54:47 字數 3778 閱讀 5134

sqlite 是乙個輕量級的關聯式資料庫。ios sdk 很早就支援了 sqlite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 標頭檔案即可。但是,原生的 sqlite api 在使用上相當不友好,在使用時,非常不便。於是,開源社群中就出現了一系列將 sqlite api 進行封裝的庫,而 fmdb 則是開源社群中的優秀者。

fmdb 在使用上相當方便。以下是乙個簡單的例子:

nsstring* docsdir = [nssearchpathfordirectoriesindomains( nsdocumentdirectory, nsuserdomainmask, yes) lastobject];

fmdatabase* db = [fmdatabase databasewithpath:dbpath];

[db open];

fmresultset *rs = [db executequery:@"select * from people"];

while ([rs next])

[db close];

可以看到,使用 fmdb 後的資料庫**清晰明了,比原生的 api 優雅多了。另外,fmdb 同時相容 arc 和非 arc 工程,會自動根據工程配置來調整相關的記憶體管理**。

該使用說明主要翻譯自 fmdb 的 github 專案說明文件

引入相關檔案

首先將 fmdb 從 github 上 clone 下來,然後將以下檔案 copy 到你的工程中:

fmdatabase.h

fmdatabase.m

fmdatabaseadditions.h

fmdatabaseadditions.m

fmdatabasepool.h

fmdatabasepool.m

fmdatabasequeue.h

fmdatabasequeue.m

fmresultset.h

fmresultset.m

建立資料庫

建立資料庫只需要如下一行即可 , 當該檔案不存在時,fmdb 會自己建立乙個。如果你傳入的引數是空串:@」」 ,則 fmdb 會在臨時檔案目錄下建立這個資料庫,如果你傳入的引數是 null,則它會建立乙個在記憶體中的資料庫。

fmdatabase *db = [fmdatabase databasewithpath:@"/tmp/tmp.db"];
開啟資料庫

使用如下語句,如果開啟失敗,可能是許可權不足或者資源不足。通常開啟完操作操作後,需要呼叫 close 方法來關閉資料庫。

if (![db open]) 

// some operation

// ...

[db close];

執行更新操作

除了 select 操作之外,其它的都是更新操作。更新操作使用如下方法,如果有錯誤,可以用 error 引數中獲得。

-[fmdatabase executeupdate:error:withargumentsinarray:orvalist:]
執行查詢操作

查詢操作示例如下。注意:即使操作結果只有一行,也需要先呼叫 fmresultset 的 next 方法。

fmresultset *s = [db executequery:@"select * from mytable"];

while ([s next])

fmresultset *s = [db executequery:@"select count(*) from mytable"];

if ([s next])

fmdb 提供如下多個方法來獲取不同型別的資料:

intforcolumn:

longforcolumn:

longlongintforcolumn:

boolforcolumn:

doubleforcolumn:

stringforcolumn:

dateforcolumn:

dataforcolumn:

datanocopyforcolumn:

utf8stringforcolumnindex:

objectforcolumn:

通常情況下,你並不需要關閉 fmresultset,因為相關的資料庫關閉時,fmresultset 也會被自動關閉。

資料引數

通常情況下,你可以按照標準的 sql 語句,用 ? 表示執行語句的引數,如:

insert into mytable values (?, ?, ?)
然後,可以我們可以呼叫 executeupdate 方法來將 ? 所指代的具體引數傳入,通常是用變長引數來傳遞進去的,如下:

nsstring *sql = @"insert into user (name, password) values (?, ?)";

[db executeupdate:sql, user.name, user.password];

這裡需要注意的是,引數必須是 nsobject 的子類,所以象 int,double,bool 這種基本型別,需要封裝成對應的包裝類才行,如下所示:

// 錯誤,42 不能作為引數

[db executeupdate:@"insert into mytable values (?)", 42];

// 正確,將 42 封裝成 nsnumber 類

[db executeupdate:@"insert into mytable values (?)", [nsnumber numberwithint:42]];

執行緒安全

使用 fmdatabasequeue 很簡單,首先用乙個資料庫檔案位址來初使化 fmdatabasequeue,然後就可以將乙個閉包 (block) 傳入 indatabase 方法中。

在閉包中運算元據庫,而不直接參與 fmdatabase 的管理。

// 建立,最好放在乙個單例的類中

fmdatabasequeue *queue = [fmdatabasequeue databasequeuewithpath:apath];

// 使用

[queue indatabase:^(fmdatabase *db)

}];// 如果要支援事務

[queue intransaction:^(fmdatabase *db, bool *rollback)

// etc…

[db executeupdate:@"insert into mytable values (?)", [nsnumber numberwithint:4]];

}];

為了檢視 sqlite 中的資料,乙個好的圖形化介面的資料庫管理程式是必不可少的。mysql 有 phpmyadmin,那麼 sqlite 呢?

我主要使用的是 firefox 的乙個名為 sqlite manager 的外掛程式,安裝此外掛程式後,可以直接開啟字尾名為 sqlite 的資料庫檔案。sqlite manager 提供乙個圖形化的介面來執行資料查詢或更改操作。如下圖所示:

在iOS開發中使用FMDB

sqlite 是乙個輕量級的關聯式資料庫。ios sdk很早就支援了sqlite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 標頭檔案即可。但是,原生的sqlite api在使用上相當不友好,在使用時,非常不便。於是,開源社群中就出現了一系列將sqlit...

在iOS開發中使用FMDB

sqlite 是乙個輕量級的關聯式資料庫。ios sdk很早就支援了sqlite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 標頭檔案即可。但是,原生的sqlite api在使用上相當不友好,在使用時,非常不便。於是,開源社群中就出現了一系列將sqlit...

在iOS開發中使用FMDB

sqlite 是乙個輕量級的關聯式資料庫。ios sdk很早就支援了sqlite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 標頭檔案即可。但是,原生的sqlite api在使用上相當不友好,在使用時,非常不便。於是,開源社群中就出現了一系列將sqlit...