FMDB

作者: 愤怒的八哥 | 来源:发表于2019-02-11 14:10 被阅读1次

    核心类

    FMDB有三个主要的类:
    FMDatabase
    一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句
    FMResultSet
    使用FMDatabase执行查询后的结果集
    FMDatabaseQueue
    用于在多线程中执行多个查询或更新,它是线程安全的

    注意

    在多个线程中同时使用一个FMDatabase实例是不明智的。不要让多个线程分享同一个FMDatabase实例,它无法在多个线程中同时使用。 如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题。所以,请使用 FMDatabaseQueue,它是线程安全的。

    1. 创建
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject; 
    NSString *filePath = [path stringByAppendingPathComponent:@"FMDB.db"];
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
    
    1. 操作数据库
    [queue inDatabase:^(FMDatabase*db) {
        //FMDatabase数据库操作
    }];
    

    3.使用事务
    事务,单个逻辑工作单元执行的一系列要么完全地执行,要么完全地不执行。

    线程安全的实现

    全局启用一个串行队列,即一个databasequeue 对应一个 queue。
    然后在串行队列中同步执行。

    _queue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL);
    dispatch_queue_set_specific(_queue, kDispatchQueueSpecificKey, (__bridge void *)self, NULL);
    

    防止死锁

    因为是同步提交因此有死锁的风险。
    判断当前队列是否自己持有的全剧队列

    FMDatabaseQueue *currentSyncQueue = (__bridge id)dispatch_get_specific(kDispatchQueueSpecificKey);
        assert(currentSyncQueue != self && "inDatabase: was called reentrantly on the same queue, which would lead to a deadlock"); 
    

    相关文章

      网友评论

          本文标题:FMDB

          本文链接:https://www.haomeiwen.com/subject/kjfqeqtx.html