Joh*_*oan 7 sqlite objective-c
我在Objective C中使用FMDatabase SQLite包装器,我有以下问题:
我正在后台线程中运行XML解析和数据库插入,以获取用户无权访问的某些内容,但是用户可以从他们所在的部分与UI和数据库进行交互.
The FMDatabase <FMDatabase: 0x17b7b0> is currently in use.
Run Code Online (Sandbox Code Playgroud)
随机地,我将得到一个"已使用的FMDatabase"通知,数据库将永远不会填充该数组.我的印象是FMDatabase类一旦获得免费就会处理它,但我有一个:
while(contents.count < 1){
sleep(1);
}
Run Code Online (Sandbox Code Playgroud)
希望一旦数据库释放,就会填充数组.我还尝试重新运行阵列填充脚本,如果数据库忙,但无济于事.
对不起,如果这个问题令人困惑,我很乐意澄清.
我遇到了同样的问题.
我切换到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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4785 次 |
| 最近记录: |