【问题标题】:SQLite Drop Table Causes Database is Locked ErrorSQLite 删除表导致数据库被锁定错误
【发布时间】:2014-06-23 05:31:04
【问题描述】:

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

显然drop table命令是

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];
 }

每次我尝试运行删除表命令时,执行都会失败并显示“数据库已锁定”,结果为 SQLITE_LOCKED。

所有其他命令都很好。我试图一遍又一遍地阅读 SQL 文档,但没有成功。 大家觉得呢?

【问题讨论】:

  • 其他一些数据库连接有一个活动事务。
  • @CL 数据库只被应用程序中的1个实例使用,数据库升级完成后才返回,所以不能有另一个活动事务。
  • 你假设什么都没关系;数据库认为还有另一个事务。
  • @hishamaus 你找到解决方案了吗。我也有同样的问题。

标签: ios iphone sqlite ipad


【解决方案1】:

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

【讨论】:

  • 根据 SQLite3 文档,sqlite3_exec 是执行 sqlite3_prepare_v2()、sqlite3_step() 和 sqlite3_finalize() 的包装语句,我假设我不需要调用 finalize。
  • @hishamaus 你在使用sqlite3_exec 吗?
  • @CL 实际上刚刚开始使用上面的代码。我尝试了正常的准备步骤 finalize 和这个,都没有工作。需要注意的一点是,如果未触及表,则 drop 命令将正常工作(如果先前插入和删除了记录,则认为它已触及)
猜你喜欢
  • 2012-02-09
  • 2018-06-11
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
相关资源
最近更新 更多