0

データベースとカーソルの管理について助けが必要です。特定のフラグメントに入ったり出たりすると、次のようになることに気付きました。

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()ご覧のとおり、これは close h(ヘルパー クラスへの参照) と読み取り可能なSQLiteDatabaseオブジェクトに対して呼び出します。hただし、ヘルパー参照をnullにせずに閉じるため、それについてはよくわかりませんnew DatabaseManager()。おそらく、シングルトン パターンでデータベースを処理するために呼び出す必要はありませんh.close()か?

それとは別に、言うまでもなく(それが私が尋ねている理由です)、フラグメントを切り替えると、上記の警告が表示されます。どうしたの?私は何をすべきか?とはend transactions in progressどういう意味ですか? メソッドを変更するかcloseConnection()、別のライフサイクル タイムで呼び出すか、またはまったく呼び出さないようにする必要がありますか?


@Selvin が指摘した恥ずかしい問題の後、h静的にしました。への呼び出しを削除するとcloseConnection()、すべて正常に機能し、警告は表示されません。つまり、どちらも呼び出していないことh.close()を意味しますまたはdb.close(). それは大丈夫ですか?そうでない場合、いつ呼び出す必要がありますか?

4

0 に答える 0