我在 iOS 应用程序中删除我在 SQLite 中创建的索引时遇到了一些麻烦。我正在使用fmdb。
尝试删除索引时,sqlite3_step
始终返回SQLITE_LOCKED
. 结果,fmdb 陷入无限循环,它不断尝试重试 drop 语句(每次都sqlite3_step
返回SQLITE_LOCKED
),并且该语句永远不会成功。
据我所知,在 drop 语句正常工作之前,没有其他进程接触数据库和语句。我错过了什么?
这几乎是失败代码的逐字副本:
[db open];
/* ... */
[db executeUpdate:@"DROP INDEX IF EXISTS bookmark_hash_idx;"];
[db close];
db
是指向我的文档目录中的 sqlite 数据库的指针。
这是来自 fmdb 的相关代码,如果有用的话:
do {
rc = sqlite3_step(pStmt);
retry = NO;
if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) {
// this will happen if the db is locked, like if we are doing an update or insert.
// in that case, retry the step... and maybe wait just 10 milliseconds.
retry = YES;
if (SQLITE_LOCKED == rc) {
rc = sqlite3_reset(pStmt);
if (rc != SQLITE_LOCKED) {
NSLog(@"Unexpected result from sqlite3_reset (%d) eu", rc);
}
}
/* ... */
}
/* ... */
} while (retry);