【发布时间】: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 你找到解决方案了吗。我也有同样的问题。