FMDatabaseQueue错误:数据库被锁定。

3

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

我正在进行查询以检查记录是否存在,之后根据结果立即进行UPDATEINSERT操作。

第一个查询正常运行并返回计数,但随后的查询无法运行。这是我收到的错误:

Unknown error calling sqlite3_step (5: database is locked) 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实例存在。 - Rob
1个回答

3

我有同样的问题。我使用全局队列创建了一个sharedInstance。

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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接