iOS | FMDB快速上手

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

提供git地址:https://github.com/ccgus/fmdb.

  • 實現客戶端數據庫操作的第三方框架.
  • 操作數據庫的類 : 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);
    }];

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章