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...