FMDatabaseQueue错误:数据库被locking

我有一个在后台线程运行的方法,所以(据我了解),我需要使用FMDatabaseQueue安全,可靠地访问我的SQLite数据库。

我正在做一个查询来检查logging的存在,之后立即UPDATEINSERT取决于结果。

第一个查询运行良好,我得到了一个计数,但后面的查询不运行。 这是我得到的错误:

未知的错误调用sqlite3_step(5:数据库被locking)欧盟

这是我的代码:

 //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查询与其他人分开吗? 任何想法为什么我的数据库在第一个查询后被locking?

我有同样的问题。 我做了与全球队列共享

context.h

 @interface context : NSObject { FMDatabaseQueue *_queue; } + (context *)sharedInstance; @property(strong, nonatomic, readwrite) FMDatabaseQueue *queue; @end 

context.m

 #import "context.h" @implementation context @synthesize queue = _queue; + (context *)sharedInstance { static dispatch_once_t onceToken; static context *instance = nil; dispatch_once(&onceToken, ^{ instance = [[context alloc] init]; }); return instance; } - (id)init { self = [super init]; if (self) { _queue = [FMDatabaseQueue databaseQueueWithPath:YOUR_SQLITE_FILE_PATH]; } return self; } @end 

如何使用它

 context *appContext = [context sharedInstance]; [appContext.queue inDatabase:^(FMDatabase *db) { FMResultSet *results = [db executeQuery:@"SELECT * FROM something"]; if([results next]) { NSLog(@"results dump = %@", [results resultDictionary]); } [results close];