2012年7月14日 星期六

SQLite 的救星 FMDB

在 Objective-C 要使用 SQLite 是一件很痛苦的事
因為控制 SQLite 是走 C lib 的作法
不是純 Objective-C 的作法,所以就有人寫出了一個更方便控制 SQLite 的 Class
那個就是 FMDB,它是一個已經將主要的控制 SQLite 功能已經包裝在一起了
方便程式設計師去控制 SQLite

安裝 FMDB
方法很簡單,就跟所有的 Class 一樣的三步驟。
1. 首先你要先把 libsqlite3.dylib 加進 library
(基本上只需要 FMDatabase、FMDatabasePool、FMResultSet)
2. 將上面三種 Class 的.h 跟.m 加進你的 project 中
3. 在需要用到 FMDB 的檔案中加入#import "FMDatabase.h"
接著就可以開心的使用 FMDB

要使用資料庫之前首先要開啟資料庫連接
開啟資料庫連接的程式法如下
FMDatabase *db = [FMDatabase databaseWithPath:dbName];
if (![db open]) {
NSLog(@"DB Can't Open");
}

當然有開啟就有關閉,關閉的方法很簡單,只要一行就能解決了
[db close];

我自己會想要將開啟連結的使用方式變得更簡單,所以就變成是這樣子
- (FMDatabase *)openDB{
NSString *dbPath = [self databasePathWithName:@"資料庫檔案名稱"];
FMDatabase *db = [FMDatabase databaseWithPath:dbPath];
if (![db open]) {
NSLog(@"DB Can't Open");
}
return db;
}

以後只要一行就能開啟資料庫了,就像是這樣子
FMDatabase *db = [self openDB];

可以開啟與關閉資料庫後,接下來就是控制它了
(使用前記得建立資料庫的連結,使用完也要關閉連結)

控制的方法分兩種,一是更新資料庫
像是建立 / 刪除資料表,寫入欄位值等等
if (![db executeUpdate:@"SQL 語法"]) {
NSLog(@"Could not create table: %@", [db lastErrorMessage]);
}

更新資料庫時也可以傳入值給它
if (![db executeUpdate:INSERT INTO 資料表名稱 (欄位 1, 欄位 2) VALUES (?,?)", @"欄位 1 的值", @"欄位 2 的值"]) {
NSLog(@"Could not insert data: %@", [db lastErrorMessage]);
}

另一個方法就是查詢資料庫的資料,這部份就比較麻煩一些
NSMutableArray* items = [NSMutableArray arrayWithCapacity:0];
FMResultSet *rs = [db executeQuery:@"SELECT 欄位 1, 欄位 2 from 資料表名稱"];

while ([rs next]) {       
int uid = [rs intForColumn:@"欄位 1"];
NSString *name = [rs stringForColumn:@"欄位 2"];     

[items addObject:[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:uid], @"欄位 1",
name, @"欄位 2",
nil]];
}

[rs close]; 

其中,查詢時可以選擇要接收的形態
如果是 int 的話,可以使用 [rs intForColumn:@"欄位 1"]
如果是 NSString 的話,可以使用 [rs stringForColumn:@"欄位 2"]
其他的形態可以在 FMResultSet.h 中看到

沒有留言: