免费开源的iOS开发学习平台

FMDB:3-线程安全(FMDatabaseQueue)

在使用FMDB时,不要创建一个单例数据库,然后在多个线程中使用。如果坚持要这么做,系统最终会崩溃会抛出一个异常。如果一定要在多个线程中使用,可以在每个线程中创建一个FMDatabase对象。另外,还有一个更好的方法就是使用FMDatabaseQueue类。用户可以生成一个FMDatabaseQueue单例,然后在多线程中使用它,FMDatabaseQueue会负责同步和协调多线程。

首先来创建一个FMDatabaseQueue队列。

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

然后这样使用它:

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

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

简单包装成事务的用法如下:

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];

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