データベースとカーソルの管理について助けが必要です。特定のフラグメントに入ったり出たりすると、次のようになることに気付きました。
W/SQLiteConnectionPool﹕ データベース '+data+data+database' の SQLiteConnection オブジェクトがリークされました! 進行中のトランザクションを適切に終了し、不要になったデータベースを閉じるようにアプリケーションを修正してください。
そのため、私はゼロから戻って、自分がいつ何をしているのかを確認するようになりました。私は持っている:
- db を作成および更新するためのいくつかのメソッドのみを含む
DatabaseHelper
クラスを拡張します。SQLiteOpenHelper
何も拡張しない
DatabaseManager
クラス。DatabaseHelper
オブジェクトへの単一の参照を保持するために、特にこれを使用します。public class DatabaseManager { private DatabaseHelper h; //class extending SQLiteOpenHelper public DatabaseManager(Context c) { if (h==null) { h = new DatabaseHelper(c.getApplicationContext()); } public Cursor query(...) { SQLiteDatabase db = h.getReadableDatabase(); return db.rawQuery(...) } public void closeConnection() { SQLiteDatabase db = h.getWritableDatabase(); db.close(); h.close(); } }
Cursor
このクラスでは、データベースにクエリを実行してオブジェクトを返すいくつかのメソッド。このクラスでは、
closeConnection()
私がよくわからないメソッドです。
このクラスをフラグメントから使用し、毎回 を呼び出しますnew DatabaseManager(getActivity())
。これにより、新しいヘルパー参照が作成されません。今、私は:
Cursor.close()
クエリから必要な情報を取得したらすぐに呼び出します。open()
SQLiteDatabase でもヘルパーを呼び出さないでください。正確にはいつですか?呼び出さなくてもすべて機能するのはなぜですか?- 私のデータベースを利用するフラグメント
manager.closeConnection()
のメソッドを呼び出します。onStop()
ご覧のとおり、これは closeh
(ヘルパー クラスへの参照) と読み取り可能なSQLiteDatabase
オブジェクトに対して呼び出します。h
ただし、ヘルパー参照をnullにせずに閉じるため、それについてはよくわかりませんnew DatabaseManager()
。おそらく、シングルトン パターンでデータベースを処理するために呼び出す必要はありませんh.close()
か?
それとは別に、言うまでもなく(それが私が尋ねている理由です)、フラグメントを切り替えると、上記の警告が表示されます。どうしたの?私は何をすべきか?とはend transactions in progress
どういう意味ですか? メソッドを変更するかcloseConnection()
、別のライフサイクル タイムで呼び出すか、またはまったく呼び出さないようにする必要がありますか?
@Selvin が指摘した恥ずかしい問題の後、h
静的にしました。への呼び出しを削除するとcloseConnection()
、すべて正常に機能し、警告は表示されません。つまり、どちらも呼び出していないことh.close()
を意味しますまたはdb.close()
. それは大丈夫ですか?そうでない場合、いつ呼び出す必要がありますか?