gpt4 book ai didi

objective-c - 带有 FMDatabase 包装器的 SQLite 数据库

转载 作者:IT王子 更新时间:2023-10-29 06:23:43 25 4
gpt4 key购买 nike

我在 Objective C 中使用 FMDatabase SQLite 包装器,但遇到以下问题:

我在后台线程中为用户无权访问的某些内容运行 XML 解析和数据库插入,但是用户能够从他们所在的部分与 UI 和数据库进行交互。

The FMDatabase <FMDatabase: 0x17b7b0> is currently in use.

随机地,我会收到“FMDatabase already in use”的通知,并且数组永远不会被数据库填充。我的印象是 FMDatabase 类一旦空闲就会处理查询,但我有一个:

while(contents.count < 1){
sleep(1);
}

希望一旦数据库释放,数组就会被填充。如果数据库繁忙但无济于事,我也尝试重新运行数组填充脚本。

如果这个问题令人困惑,我很抱歉,我很乐意澄清。

最佳答案

我遇到了同样的问题。

我为必须执行的每个数据库查询/更新切换到 FMDatabaseQueue。它就像一个魅力!

使用 performSelectorOnMainThread 是个好主意,但在实际编码时,传递参数和获取结果以供进一步使用可能会非常棘手。

编辑:这是一个小例子

-(void) updateTaskStateAsync:(NSNumber *)taskID withNewStatus:(NSNumber *)state andCompletionBlock:(void(^)(BOOL status))completionBlock{

NSString *errInfo = [NSString stringWithFormat:@"taskID %d - state %d", [taskID intValue], [state intValue]];

[queue inDatabase:^(FMDatabase *db) {
BOOL r = [db executeUpdate:@"UPDATE tasks SET state=?, date_job_last_updated=? WHERE identifier=?", state, [NSDate dateWithTimeIntervalSinceNow:0], taskID];
DB_DISPLAY_ERROR(errInfo); // convenient macro to log errors

if(completionBlock)
completionBlock(r);
}];
}

-(BOOL) updateTaskStateSync:(NSNumber *)taskID withNewStatus:(NSNumber *)state {

NSString *errInfo = [NSString stringWithFormat:@"taskID %d - state %d", [taskID intValue], [state intValue]];
__block BOOL r = NO;
__block BOOL ended = NO;

[queue inDatabase:^(FMDatabase *db) {
r = [db executeUpdate:@"UPDATE tasks SET state=?, date_job_last_updated=? WHERE identifier=?", state, [NSDate dateWithTimeIntervalSinceNow:0], taskID];
DB_DISPLAY_ERROR(errInfo); // convenient macro to log errors

ended = YES;
}];

NSCondition *cond = [[NSCondition alloc] init];
[cond lock];
while(!ended)
[cond wait];

[cond unlock];

return r;
}

关于objective-c - 带有 FMDatabase 包装器的 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5775269/

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