FMDB executeUpdate DROP命令会暂停应用程序

时间:2011-09-07 09:24:35

标签: ios cocoa-touch sqlite fmdb

我想在名为database.db的SQLite数据库文件中删除一个表。使用后

NSLog(@"i show up in the console");
[db executeUpdate:@"DROP TABLE IF EXISTS `article`;"];
NSLog(@"i will not show up in the console");

应用程序停在查询位置。查询之前的NSLog显示在控制台中。查询后直接在控制台窗口中不显示NSlog。此外,在应用程序运行时,在模拟器应用程序文件夹中连续创建并删除名为database.db-journal的临时文件。该应用程序不会崩溃,不会给出任何错误,也不会继续...删除查询中的“如果EXISTS”不起作用,删除反引号不起作用,删除分号不起作用。
启用查询跟踪仅显示FMDB正在处理我的查询,不再显示。

我真的很困惑为什么会这样。我认为该表必须是空的才能删除它,所以我添加了一个查询来删除其中的每个记录。但是id并不重要,应用程序仍然被丢弃查询抓住了。我没有办法解决这个错误。
如果我在SQLite数据库浏览器2中执行drop命令,一切正常。

使用调试器进行的进一步研究表明,FMDB包装器进入无限循环,因为语句的返回值等于SQLITE_LOCKED常量,这意味着我要删除的表被锁定。在先前的查询中发送“UNLOCK TABLES”并不能解决这个问题。桌子锁定的原因是什么?为什么从锁定表中删除记录会起作用?

2 个答案:

答案 0 :(得分:14)

我遇到了同样的问题,并且在更新之前通过调用closeOpenResultSets实例上的FMDB解决了问题,就像TRD所说的那样(尽管我没有关闭并重新打开数据库完全地)

答案 1 :(得分:0)

我终于摆脱了这种令人讨厌的行为。我在drop查询之前关闭了数据库连接并立即重新打开它。如果我不得不猜测我会说我的源代码的早期部分中的SELECT-Queries使得连接被锁定为DROP语句。因此关闭数据库连接并重新打开它会重置这些锁。希望这可以帮助你@JLoewy。