gpt4 book ai didi

iphone - SQLite 异常 : SQLite Busy

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

任何人都可以提供有关此错误的任何意见。我正在尝试使用 Objective C 插入到表中。

当我执行此操作时,出现 SQLite Busy 错误。为什么会这样?

最佳答案

如果在调用 sqlite3 函数时得到错误代码 SQLITE_BUSY 的结果,这意味着 drdaeman 观察到数据库已被同一进程或您进程中的一个线程锁定。

处理这种情况的正确方法是循环尝试操作,如果返回码仍然是SQLITE_BUSY,等待一段时间(超时值由您决定)然后在下一个循环中重试操作迭代。

例如,以下代码片段取自 Objective C 包装器 FMDB (http://code.google.com/p/flycode/source/browse/trunk/fmdb),展示了如何在考虑到某些操作可能返回 SQLITE_BUSY 的情况下为查询准备语句:

int numberOfRetries = 0;
BOOL retry = NO;

if (!pStmt) {
do {
retry = NO;
rc = sqlite3_prepare(db, [sql UTF8String], -1, &pStmt, 0);

if (SQLITE_BUSY == rc) {
retry = YES;
usleep(20);

if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {
NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]);
NSLog(@"Database busy");
sqlite3_finalize(pStmt);
[self setInUse:NO];
return nil;
}
}
else if (SQLITE_OK != rc) {


if (logsErrors) {
NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]);
NSLog(@"DB Query: %@", sql);
if (crashOnErrors) {

NSAssert2(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]);
}
}

sqlite3_finalize(pStmt);

[self setInUse:NO];
return nil;
}
}
while (retry);
}

顺便说一句,如果您需要访问 sqlite,FMDB 非常方便,并且相对于通过 native C API 直接访问而言更易于使用。

关于iphone - SQLite 异常 : SQLite Busy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/964207/

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