保持FMDB线程安全

时间:2012-07-23 19:40:16

标签: iphone fmdb

我在FMDB 2.0中看到,作者为线程添加了FMDatabaseQueue。例子是:

// First, make your queue.

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
Then use it like so:

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

    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    }
}];
// An easy way to wrap things up in a transaction can be done like this:

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

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

两个问题,应该是databaseQueueWithPath参数是什么?这是我的数据库所在的路径吗?

第二个问题,如果您有多个更新并且您不希望它们相互叠加,我可以看到它是如何工作的。但是,如果要将数据插入数据库,还想访问数据库中的其他数据,那么用户仍然可以在插入数据时使用您的应用程序。那可能吗?谢谢!

1 个答案:

答案 0 :(得分:2)

是的,databaseQueueWithPath:获取数据库的路径。

对于你的第二个问题,如果你在后台线程中插入数据并且你可以将它分解成块(所以在[queue inDatabase:]中花费的时间不长),那么是的,你可以在发生这种情况时仍然可以使用应用程序。当一个已经在使用时,你将无法使用各种队列方法。