SQLite删除表格导致数据库被锁定错误

3

我创建了一个小型的数据库升级工具,根据PRAGMA user_version更新我们的sqlite数据库表。一直以来都运行良好,直到最近我需要完全删除一个表。

显然,删除表的命令是

DROP TABLE tbl;

SQL指令使用以下方式执行:

NSString *currentUpdateStatement = [upgradeStatements objectAtIndex:statementNumber];
DLog(@"Update statement is: %@", currentUpdateStatement);
const char *sql_stmt = [currentUpdateStatement UTF8String];
char *errMsg;
//Start executing the upgrade command
if (sqlite3_exec(self.database, sql_stmt, NULL, NULL, &errMsg) == SQLITE_OK)
{
    DLog(@"Upgrade statement %i successful", statementNumber);
} else {
    NSString *errorMessage = [NSString stringWithUTF8String:errMsg];
    ELog(@"Upgrading failed at statement %i in version %i. Message: %@",
    statementNumber, newVersionNumber, errorMessage);
    [NSException raise:@"Database upgrade failed"
    format:@"Database could not be upgraded to version %i. "
    "Failed at command %i due to error '%@'",newVersionNumber, statementNumber, errorMessage];
 }

每次我尝试运行一个删除表的命令时,执行都会失败,并显示 'database is locked' 的结果,错误代码为 SQLITE_LOCKED。
所有其他命令都没问题。我尝试反复阅读SQL文档,但没有任何收获。 你们认为是什么原因呢?

其他数据库连接存在活动事务。 - CL.
@CL 数据库仅被应用程序中的1个实例使用,并且只有在数据库升级完成后才会返回,因此不可能有另一个活动事务。 - hishamaus
无论你做出什么假设,数据库都认为存在另一个事务。 - CL.
@hishamaus,你找到解决方法了吗?我也遇到了同样的问题。 - Ayan Sengupta
1个回答

3
在先前的事务之后缺少sqlite3_finalize(statement)可能会导致此错误。

根据SQLite3文档,sqlite3_exec是一个包装语句,它执行sqlite3_prepare_v2()、sqlite3_step()和sqlite3_finalize(),我假设我不需要调用finalize。 - hishamaus
@hishamaus 你是在所有情况下都使用 sqlite3_exec 吗? - CL.
@CL 实际上刚刚开始使用以上代码。我尝试了普通的准备步骤和完成步骤,但都没有成功。需要注意的是,如果表格没有被操作过(如果之前插入和删除了记录,则视为已操作),则删除命令将正常工作。 - hishamaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接