在ios使用FMDB

sanjunsheng 2012-11-07

安裝FMDB

方法很簡單,就跟所有的opensourcelibrary一樣的三步驟。

1.首先你要先把libsqlite3.dylib加進library

2.在需要用到FMDB的檔案中#import"FMDatabase.h"

3.把FMDB的.h跟.m加進你的project中

接著就可以開心的使用FMDB

產生Database

基本上就是透過
+[FMDatabase databaseWithPath]
取產生Database instance。
NSURL *appUrl = [[[NSFileManager defaultManager] 
     URLsForDirectory:NSDocumentDirectory 
            inDomains:NSUserDomainMask] lastObject];
NSString *dbPath = [[appUrl path] stringByAppendingPathComponent:@"MyDatabase.db"];   
FMDatabase* db = [FMDatabase databaseWithPath:dbPath];

if (![db open]) {       
 NSLog(@"Could not open db");       
}

產生所需table

其實寫過sql的應該對接下來的動作都不陌生,都一樣就是sql語法囉,詳細的請參考sqlite文件

下面的動作是產生一個user的table,並且有uid,name,descritpion三個column。我們使用IFNOTEXISTS來保證table不存在才會產生table。

if(![db executeUpdate:@"CREATE TABLE IF NOT EXISTS user (uid integer primary key asc autoincrement, name text, description text)"])
{
 NSLog(@"Could not create table: %@", [db lastErrorMessage]);
}

新增record

在FMDB中,它有提供很貼心類似-[NSStringstringWithFormat:...]的功能,但是比較不一樣的是如果你是字串,它會幫你加上括號,使用上更為便利。

if(![db executeUpdate:@"INSERT INTO user (name, description) VALUES (?,?)", name, description])
{
 NSLog(@"Could not insert data: %@", [db lastErrorMessage]);
}

刪除record

一樣是下sql語法,這邊比較需要注意的是如果你要傳進去的是int,double這種基本形態,記得要轉換成物件,也就是用+[NSNumbernumberWithInt]去轉換

if(![_db executeUpdate:@"DELETE FROM user WHERE uid = ?", [NSNumber numberWithInt:uid]])
{
 NSLog(@"Could not delete data: %@", [db lastErrorMessage]);
}

查詢資料

在FMDB中有提供另外一個classFMResultSet來存放查詢出來的records,透過-[FMResultSetnext]來iterate出所有的record

NSMutableArray* items = [NSMutableArray arrayWithCapacity:0];
FMResultSet *rs = [db executeQuery:@"SELECT uid, name, description from user"];

while ([rs next]) {       
 int uid = [rs intForColumn:@"uid"];
 NSString *name = [rs stringForColumn:@"name"];       
 NSString *description = [rs stringForColumn:@"description"];       
   
 [items addObject:[NSDictionary dictionaryWithObjectsAndKeys:
       [NSNumber numberWithInt:uid], @"uid",
       name, @"name",
       description, @"description",
       nil]];
}

[rs close];

基本上在其他oo平台中有用過sql的,對於FMDB的設計應該並不陌生,可以說完全不會有太多的困難。而相較於用傳統的plist或是archive的方法,我相信不管是效能上或是功能上,Sqlite+FMDB的組合絕對會更有優勢。對於中型以上的iOS程式應該會是標準配備。

相关推荐