2011-09-07 59 views
4

我想在名为database.db的SQLite数据库文件中删除一个表。使用后FMDB executeUpdate DROP命令确实停止了应用程序

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数据库浏览器2中执行drop命令,一切正常。

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

+0

你有没有解决曾经找到答案?我有同样的问题 – JLoewy

回答

14

我有同样的问题,得到它通过调用FMDB实例closeOpenResultSets刚刚更新之前,就像TRD说(虽然我没有关闭和完全打开数据库)

+0

这似乎是比我自己的更具体的答案,所以我接受它。谢谢。 – TRD

+1

我爱你altschuler,这让我坚持了几个小时 –

+0

这也让我的团队疯狂了好几个小时。 FMResultSet在dealloc上自动关闭,但是如果ARC在调用drop table之前没有清理内存,将会有打开的结果集导致此错误。谢谢! – Ryan

0

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