1. 程式人生 > >iOS | FMDB快速上手

iOS | FMDB快速上手

任何的開發都或多或少的接觸到資料庫,而在IOS中一般使用的是SQLite資料庫,這是一個輕量功能較為不錯的資料庫.而現在用到比較多的第三方資料庫操作框架就是FMDB.廢話不多說,相信查詢到這篇文章的都是已經上手的IOS開發者,直接上一些相關使用.

提供git地址點選這裡.

首先簡單介紹下

實現客戶端資料庫操作的第三方框架.
操作資料庫的類 : FMDatabase.h
佇列排程資料庫執行的類 : FMDatabaseQueue.h
查詢資料的類 : FMResultSet.h

注意

第三方的官方文件是這麼說的:

FMDatabaseQueue - If you're wanting to perform queries and updates on multiple threads, you'll want to use this class. It's described in the "Thread Safety" section below.

翻譯:如果你像去實現查詢和更新在多執行緒上,你就是用這個類,這個是建立線上程安全之上的.
做法:一般自行封裝成一個工具類,設計成單例.
目的:全域性只有一個序列佇列,這樣操作資料庫更加安全.

先建立.h檔案
@interface FMDatabaseQueueManager : FMDatabaseQueue
//提供單例入口
+ (instancetype)sharedManager;
@end
在.m檔案中實現方法,建立一個數據庫
+(instancetype)sharedManager{
    static FMDatabaseQueueManager *instance;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 1.獲取資料庫路徑,將要把資料庫存到這個路徑中.
        NSString *SQLPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"my.db"];
        // 2. 建立管理資料庫物件
        instance = [FMDatabaseQueueManager databaseQueueWithPath:SQLPath];
    });

    return instance;
}
新建表
  [[FMDatabaseQueueManager sharedManager] inDatabase:^(FMDatabase *db) {
            BOOL isCreate = [db executeUpdate:@"create table if not exists t_person(id integer primary key,name text not null,age integer);"];
使用事務插入資料
// 1.定義SQL語句
    NSString *insertSQL = @"insert into t_person(name,age) values(?,?);";

    // 2.佇列排程資料庫,使用事務插入資料,效能比原生SQLite3要好
    [[FMDatabaseQueueManager sharedManager] inTransaction:^(FMDatabase *db, BOOL *rollback) {

        // 3.迴圈新增大批量的資料
        for (NSInteger i = 0; i < 1000; i++) {

            // 4.執行SQL
            BOOL isOK = [db executeUpdate:insertSQL,@"張三",@(100)];

            // 出錯就回滾
            if (!isOK) {
                // 回滾快照
                *rollback = YES;
                // 非常重要
                break;
            }
        }
    }];
查詢資料
// 1.定義SQL語句
    NSString *updateSQL = @"select name,age from t_person;";

    // 2.佇列排程資料庫
    [[FMDatabaseQueueManager sharedManager] inDatabase:^(FMDatabase *db) {

        // 3.執行SQL
        FMResultSet *resultSet = [db executeQuery:updateSQL];
        // 4.逐條取記錄
        while ([resultSet next]) {

            NSString *name = [resultSet stringForColumn:@"name"];
            int age = [resultSet intForColumn:@"age"];

            NSLog(@"%@ -- %d",name,age);
        }
    }];
刪除資料
// 1.定義SQL語句
    NSString *updateSQL = @"delete from t_person where id = ?;";

    // 2.佇列排程資料庫
    [[FMDatabaseQueueManager sharedManager]  inDatabase:^(FMDatabase *db) {

        // 3.執行SQL
        BOOL isOK = [db executeUpdate:updateSQL,@(6)];
        if (isOK) {
            NSLog(@"刪除資料成功");
        } else {
            NSLog(@"刪除資料失敗");
        }
    }];
修改資料
// 1.定義SQL語句
    NSString *updateSQL = @"update t_person set name = ?,age = ? where id = ?;";

    // 2.佇列排程資料庫
    [[FMDatabaseQueueManager sharedManager]  inDatabase:^(FMDatabase *db) {

        // 3.執行SQL
        BOOL isOK = [db executeUpdate:updateSQL,@"王五",@(19),@(3)];
        if (isOK) {
            NSLog(@"更新資料成功");
        } else {
            NSLog(@"更新資料失敗");
        }

        NSLog(@"影響行數 %d", db.changes);
    }];