Команда FMDB executeUpdate DROP останавливает приложение - PullRequest
4 голосов
/ 07 сентября 2011

Я хочу удалить таблицу в моем файле базы данных SQLite с именем database.db. После использования

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 в SQLite Database Browser 2, все работает нормально.

Дальнейшие исследования с отладчиком показали, что оболочка FMDB входит в бесконечный цикл, потому что возвращаемое значение оператора равно константе SQLITE_LOCKED, что означает, что таблица, которую я хочу удалить, заблокирована. Отправка «UNLOCK TABLES» в предыдущем запросе не решает эту проблему. Почему стол заблокирован? Почему удаление записей из заблокированной таблицы будет работать?

Ответы [ 2 ]

14 голосов
/ 05 декабря 2011

У меня была та же проблема, и я решил ее, вызвав closeOpenResultSets на экземпляре FMDB непосредственно перед обновлением, как сказал TRD (хотя мне не пришлось закрывать и снова открывать базу данных полностью)

0 голосов
/ 08 ноября 2011

Я наконец избавился от этого неприятного поведения.Я закрыл соединение с базой данных прямо перед запросом на сброс и немедленно снова открыл его.Если бы мне пришлось угадывать, я бы сказал, что SELECT-Queries в более ранних частях моего исходного кода заставляло соединение быть заблокированным для DROP-операторов.Таким образом, закрытие соединения с базой данных и повторное открытие сбрасывает эти блокировки.Надеюсь, это поможет тебе @ JLoewy.

...