4

我想在名为 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 的临时文件。该应用程序不会崩溃,不会给出任何错误并且不会继续...删除查询中的“IF EXISTS”不起作用,删除反引号不起作用,删除分号不起作用。
启用查询跟踪仅显示 FMDB 正在处理我的查询,没有更多显示。

我真的很困惑为什么会这样。我认为该表必须为空才能删除,因此我添加了一个查询以删除其中的每条记录。但是 id 无关紧要,该应用程序仍然会在 drop-query 中被捕获。我没有解决此错误的可能性。
如果我在 SQLite Database Browser 2 中执行 drop 命令,一切正常。

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

4

2 回答 2

14

我遇到了同样的问题,并通过在更新之前调用实例来解决它closeOpenResultSetsFMDB就像 TRD 所说的那样(尽管我不必完全关闭并重新打开数据库)

于 2011-12-05T18:06:26.673 回答
0

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

于 2011-11-08T09:28:03.663 回答