gpt4 book ai didi

ios - 调频数据库队列错误 : database is locked

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:59 26 4
gpt4 key购买 nike

我有一个在后台线程中运行的方法,因此(据我所知)我需要使用 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 查询与其他查询分开?知道为什么我的数据库在第一次查询后被锁定了吗?

最佳答案

我也有同样的问题。我用全局队列制作了 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];

关于ios - 调频数据库队列错误 : database is locked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25331261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com