FMDB數據庫

IOS操作數據庫,SQLite3和coredata是兩個非常好的選擇,但是對於我們這些掌握了其他數據庫語言的人來說,使用這兩中操作都 會覺得不方便,SQLite3使用起來太複雜了,而使用coredata的時候卻封裝太死了,我們需要自己些自己的數據庫語句,這時候,FMDB就是一個 非常不錯的選擇!
什麼是FMDB 
FMDB是iOS平臺的SQLite數據庫框架 FMDB以OC的方式封裝了SQLite的C語言API
FMDB的優點 
使用起來更加面向對象,省去了很多麻煩、冗餘的C語言代碼 對比蘋果自帶的Core Data框架,更加輕量級和靈活 提供了多線程安全的數據庫操作方法,有效地防止數據混亂
FMDB有三個主要的類 
①FMDatabase一個FMDatabase對象就代表一個單獨的SQLite數據庫 用來執行SQL語句
②FMResultSet使用FMDatabase執行查詢後的結果集
③FMDatabaseQueue用於在多線程中執行多個查詢或更新,它是線程安全的
————————————————————————
具體使用
1、導入頭文件
#import "FMDatabase.h"

2、定義成員變量
FMDatabase* _db;

3、創建數據庫.db文件
NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/data.db"];

4、用path路徑初始化FMDatabase
_db = [[FMDatabase alloc] initWithPath:path];

5、打開數據庫[_db open]
//打開數據庫
    BOOL res = [_db open];
    if (res == NO) {
        NSLog(@"打開失敗");
        return;
    }

6、創建表
res = [_db executeUpdate:@"create table if not exists USER(id integer primary key autoincrement,name,score,p_w_picpath)"];
    if (res == NO) {
        NSLog(@"創建表失敗");
    }

7、關閉數據庫
[_db close];

8、增加操作
//FMDB支持類型  NSString NSNumber NSData
將數據轉化爲能夠存儲進數據庫的類型
NSData* p_w_picpathData = UIImagePNGRepresentation(_p_w_picpathView.p_w_picpath);
    NSString* name = _nameField.text;
    NSNumber* score = [NSNumber numberWithInt:[_scoreField.text intValue]];
    //打開數據庫
    BOOL res = [_db open];
    if (res == NO) {
        NSLog(@"打開失敗");
    }

//插入數據
    res = [_db executeUpdate:@"insert into USER(name,score,p_w_picpath) values(?,?,?)", name, score, p_w_picpathData];
    if (res == NO) {
        NSLog(@"插入數據失敗");
    }
    [_db close];

9、刪除操作
//刪
- (void)del:(id)sender{
    BOOL res = [_db open];
    if (res == NO) {
        NSLog(@"打開失敗");
        return;
    }
    res = [_db executeUpdate:@"delete from USER where name=?", _nameField.text];
    if (res == NO) {
        NSLog(@"刪除失敗");
    }
    [_db close];
}

10、查詢操作
//查
- (void)fetch:(id)sender{
    BOOL res = [_db open];
    if (res == NO) {
        NSLog(@"打開失敗");
        return;
    }
    FMResultSet* set = [_db executeQuery:@"select * from USER"];
    while ([set next]) {
        //取值
        NSString* name = [set stringForColumn:@"name"];
        int score = [set intForColumn:@"score"];
        NSData* data = [set dataForColumn:@"p_w_picpath"];
        NSLog(@"%@ --- %d", name, score);
        //[set objectForColumnName:@"score"];
    }
    [_db close];
}

——————————————————————————————————————
多線程管理FMDB:
FMDatabase這個類是線程不安全的,如果在多個線程中同時使用一個FMDatabase實例,會造成數據混亂等問題
爲了保證線程安全,FMDB提供方便快捷的FMDatabaseQueue類
使用FMDatabaseQueue很簡單,首先用一個數據庫文件地址來初使化FMDatabaseQueue,然後就可以將一個閉包(block)傳入inDatabase方法中。在閉包中操作數據庫,而不直接參與FMDatabase的管理。

FMDatabaseQueue的創建 
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
簡單使用 [queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];
    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
    FMResultSet *rs = [db executeQuery:@"select * from t_student"];
    while ([rs next]) {
            // …
    }
}];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章