我创建了一个小的数据库升级工具,以基于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文档。
你们有什么感想?
最佳答案
前一个事务后缺少sqlite3_finalize(statement)可能导致此错误。