我在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参数是什么?这是我的数据库所在的路径吗?
第二个问题,如果您有多个更新并且您不希望它们相互叠加,我可以看到它是如何工作的。但是,如果要将数据插入数据库,还想访问数据库中的其他数据,那么用户仍然可以在插入数据时使用您的应用程序。那可能吗?谢谢!
答案 0 :(得分:2)
是的,databaseQueueWithPath:获取数据库的路径。
对于你的第二个问题,如果你在后台线程中插入数据并且你可以将它分解成块(所以在[queue inDatabase:]中花费的时间不长),那么是的,你可以在发生这种情况时仍然可以使用应用程序。当一个已经在使用时,你将无法使用各种队列方法。