你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 在iOS開發中使用FMDB

在iOS開發中使用FMDB

編輯:IOS開發綜合

前言

SQLite (http://www.sqlite.org/docs.html) 是一個輕量級的關系數據庫。iOS SDK很早就支持了SQLite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 頭文件即可。但是,原生的SQLite API在使用上相當不友好,在使用時,非常不便。於是,開源社區中就出現了一系列將SQLite API進行封裝的庫,而FMDB (https://github.com/ccgus/fmdb) 則是開源社區中的優秀者。

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

1
2
3
4
5
6
7
8
9
10
11
NSString* docsdir = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* dbpath = [docsdir stringByAppendingPathComponent:@"user.sqlite"];
FMDatabase* db = [FMDatabase databaseWithPath:dbpath];
[db open];
FMResultSet *rs = [db executeQuery:@"select * from people"];
while ([rs next]) {
    NSLog(@"%@ %@",
        [rs stringForColumn:@"firstname"],
        [rs stringForColumn:@"lastname"]);
}
[db close];

可以看到,使用FMDB後的數據庫代碼清晰明了,比原生的API優雅多了。另外,FMDB同時兼容ARC和非ARC工程,會自動根據工程配置來調整相關的內存管理代碼。

使用說明

該使用說明主要翻譯自fmdb的github項目說明文檔: https://github.com/ccgus/fmdb

引入相關文件

首先將FMDB從github上clone下來,然後將以下文件copy到你的工程中:

1
2
3
4
5
6
7
8
9
10
FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMDatabasePool.h
FMDatabasePool.m
FMDatabaseQueue.h
FMDatabaseQueue.m
FMResultSet.h
FMResultSet.m

建立數據庫

建立數據庫只需要如下一行即可,當該文件不存在時,fmdb會自己創建一個。如果你傳入的參數是空串:@”” ,則fmdb會在臨時文件目錄下創建這個數據庫,如果你傳入的參數是 NULL,則它會建立一個在內存中的數據庫。

1
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];

打開數據庫

使用如下語句,如果打開失敗,可能是權限不足或者資源不足。通常打開完操作操作後,需要調用close方法來關閉數據庫。

1
2
3
4
5
6
7
8
if (![db open]) {
    // error 
    return;
}
// some operation
// ...

[db close];

執行更新操作

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

1
-[FMDatabase executeUpdate:error:withArgumentsInArray:orVAList:]

執行查詢操作

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

1
2
3
4
5
6
7
8
9
FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
while ([s next]) {
    //retrieve values for each record
}

FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];
if ([s next]) {
    int totalCount = [s intForColumnIndex:0];
}

FMDB提供如下多個方法來獲取不同類型的數據:

1
2
3
4
5
6
7
8
9
10
11
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:

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

數據參數

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

1
INSERT INTO myTable VALUES (?, ?, ?)

然後,可以我們可以調用executeUpdate方法來將?所指代的具體參數傳入,通常是用變長參數來傳遞進去的,如下:

1
2
NSString *sql = @"insert into User (name, password) values (?, ?)";
[db executeUpdate:sql, user.name, user.password];

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

1
2
3
4
// 錯誤,42不能作為參數
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", 42];
// 正確,將42封裝成 NSNumber 類
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]];

線程安全

如果我們的app需要多線程操作數據庫,那麼就需要使用FMDatabaseQueue來保證線程安全了。 切記不能在多個線程中共同一個FMDatabase對象並且在多個線程中同時使用,這個類本身不是線程安全的,這樣使用會造成數據混亂等問題。

使用FMDatabaseQueue很簡單,首先用一個數據庫文件地址來初使化FMDatabaseQueue,然後就可以將一個閉包(block)傳入inDatabase方法中。 在閉包中操作數據庫,而不直接參與FMDatabase的管理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 創建,最好放在一個單例的類中
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

// 使用
[queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        // …
    }
}];

// 如果要支持事務
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

    if (whoopsSomethingWrongHappened) {
        *rollback = YES;
        return;
    }
    // etc…
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];
}];

工具

為了查看Sqlite中的數據,一個好的圖形化界面的數據庫管理程序是必不可少的。mysql有phpMyAdmin,那麼sqlite呢?

我主要使用的是Firefox的一個名為SQLite Manager的插件,安裝此插件後,可以直接打開後綴名為sqlite的數據庫文件。SQLite Manager提供一個圖形化的界面來執行數據查詢或更改操作。如下圖所示:

\

總結

FMDB將SQLite API進行了很友好的封裝,使用上非常方便,對於那些使用純Sqlite API來進行數據庫操作的app,可以考慮將其遷移到基於FMDB上,這對於以後數據庫相關功能的開發維護,可以提高不少效率。

我在學習fmdb的時候做了一個小工程用於練習,我把它放到github上了。感興趣的可以自行下載:https://github.com/tangqiaoboy/FmdbSample<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CtejtPO80s3mtcO/qtDEoaM8L3A+Cgo8cCBjbGFzcz0="meta"> Posted by 唐巧 Apr 22nd, 2012 iOS

原創文章,版權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved