【发布时间】:2014-08-15 17:33:08
【问题描述】:
我有一个在后台线程中运行的方法,因此(据我了解)我需要使用 FMDatabaseQueue 来安全可靠地访问我的 SQLite 数据库。
我正在查询是否存在记录,然后根据结果立即UPDATE 或INSERT。
第一个查询运行良好,我得到一个计数,但随后的查询没有运行。这是我得到的错误:
调用sqlite3_step的未知错误(5:数据库被锁定)eu
这是我的代码:
//Establish database queue
NSString *path = [[PPHelpers documentsPath] stringByAppendingPathComponent:@"PilotPro2.db"];
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
//Start thread-safe database queue
[queue inDatabase:^(FMDatabase *dbq) {
NSUInteger count;
//The other parameters in this query are provided beforehand
NSString *query = [NSString stringWithFormat:@"SELECT COUNT(%@) AS counter FROM %@ WHERE %@ = '%@'",columnID, model, columnID, dict[columnID]];
FMResultSet *countResult = [dbq executeQuery:query]; //This works fine
while([countResult next]) {
count = [countResult intForColumn:@"counter"];
}
[countResult close];
if(count > 0){
//--- UPDATE
//-- This is where FMDB throws the error...
[dbq executeUpdate:[PPDatabase editAircraftQuery:dict[columnID]], dict[@"aircraftRegistration"], dict[@"makeModel"], dict[@"categoryClass"], dict[@"highPerformance"], dict[@"complex"], dict[@"turbine"], dict[@"turboprop"], dict[@"tailwheel"], dict[@"active"]];
}else{
//--- INSERT
[dbq executeUpdate:[PPDatabase addAircraftQuery], dict[@"aircraftID"], dict[@"aircraftRegistration"], dict[@"makeModel"], dict[@"categoryClass"], dict[@"highPerformance"], dict[@"complex"], dict[@"turbine"], dict[@"turboprop"], dict[@"tailwheel"], dict[@"active"]];
}
}];
我是否需要以某种方式将我的 SELECT 查询与其他查询分开?知道为什么我的数据库在第一次查询后被锁定了吗?
【问题讨论】:
-
您应该为整个应用拥有一个共享的
FMDatabaseQueue实例。还要确保您没有任何FMDatabase实例徘徊。
标签: ios objective-c multithreading sqlite fmdb