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 は問題ではありません。アプリはまだドロップ クエリに引っかかっています。このエラーを解決する可能性がなくなりました。
SQLite Database Browser 2 内で drop コマンドを実行すると、すべて正常に動作します。
デバッガーを使用してさらに調査したところ、ステートメントの戻り値が SQLITE_LOCKED 定数と等しいため、FMDB ラッパーが無限ループに陥っていることがわかりました。これは、削除するテーブルがロックされていることを意味します。以前のクエリで「UNLOCK TABLES」を送信しても、これは解決されません。テーブルがロックされているのはなぜですか? ロックされたテーブルからのレコードの削除が機能するのはなぜですか?