MFDB 自动支持多线程编程,要注意的是:
1、多个线程不能使用同一个 FMDatabase 对象实例;
2、只能使用一个 FMDatabaseQueue 对象实例,来进行多线程编程;
3、即多个线程共享一个 FMDatabaseQueue 是安全, FMDatabaseQueue 会保证线程顺序访问数据库,如下图;
4、另外,使用 FMDatabaseQueue 的线程,在访问数据库操作返回前,会被阻塞起来,因此,如果在主线程里使用 FMDatabaseQueue 可能会影响 UI 的及时响应;
如:
1、创建队列实例:
FMDatabaseQueue* queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
2、使用:
[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])
{
…
}
}];
此外,还可以使用事务:
[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]];
}];