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 は問題ではありません。アプリはまだドロップ クエリに引っかかっています。このエラーを解決する可能性がなくなりました。
SQLite Database Browser 2 内で drop コマンドを実行すると、すべて正常に動作します。

デバッガーを使用してさらに調査したところ、ステートメントの戻り値が SQLITE_LOCKED 定数と等しいため、FMDB ラッパーが無限ループに陥っていることがわかりました。これは、削除するテーブルがロックされていることを意味します。以前のクエリで「UNLOCK TABLES」を送信しても、これは解決されません。テーブルがロックされているのはなぜですか? ロックされたテーブルからのレコードの削除が機能するのはなぜですか?

4

2 に答える 2

14

私は同じ問題を抱えていましたが、TRDが言ったように、更新の直前にインスタンスを呼び出すことで解決しました(ただし、データベースを完全に閉じて再度開く必要はありませんでしcloseOpenResultSetsた)FMDB

于 2011-12-05T18:06:26.673 に答える
0

私はついにこの厄介な行動を取り除きました。ドロップクエリの直前にデータベース接続を閉じて、すぐに再度開きました。推測する必要がある場合は、ソースコードの前の部分のSELECTクエリによって、DROPステートメントの接続がロックされたと言えます。したがって、データベース接続を閉じて再度開くと、これらのロックがリセットされます。これが@JLoewyに役立つことを願っています。

于 2011-11-08T09:28:03.663 に答える