web-dev-qa-db-ja.com

データベースのSQLiteConnectionオブジェクトがリークしました!アプリケーションを修正してください

私のアプリケーションはこの警告を発します

データベース '+ data + data + com_example_test + database'のSQLiteConnectionオブジェクトがリークしました!アプリケーションを修正して、進行中のトランザクションを適切に終了し、不要になったらデータベースを閉じてください。

ただし、使用するたびにdbオブジェクトとカーソルを閉じます。

        try {
            while (cursor.moveToNext()) {
              ...
            }
        } finally {
            if (cursor != null && !cursor.isClosed())
                cursor.close();
        }

...
    db.close();

何が問題なのか理解するのを手伝ってもらえますか?ありがとう!!!

UPDATE !私はこの投稿からこの解決策を試してみます すべてが閉じているにもかかわらずSQLite Connectionがリークしました

そして、私はもうメモリリークがありません、それは良い解決策ですか?

42
user3906040

可能な解決策

  • 開始した_not committed the transactions_があります(開始したら、常にトランザクションを閉じる必要があります)
  • Sqliteを使用している場合は、開いたカーソルを閉じたかどうかを確認します(投稿したコードからこのステップを実行したように見えます)
  • また、_db.close_をfinallyブロックに移動します
  • context.deleteDatabase(...)で削除してからdbHelper.getWritableDatabase()で再作成する前に、データベースで_db.close_を呼び出していない
26
Devrath

db.closeからfinallyブロックに移動します。

7
G. Blake Meike
//Inside your SQLite helper class
@Override
public synchronized void close () {
    if (db != null) {
        db.close();
        super.close();
    }
}

//Inside the activity that makes a connection to the helper class
@Override
protected void onDestroy () {
    super.onDestroy();
    //call close() of the helper class
    dbHelper.close();
}
1
Ave Maria

おそらく、デバッグサンプルのブレークポイントを削除するのを忘れました: ここに画像の説明を入力してください

0
steve Rogers

私の場合、エラーは、yが新しいデータをダウンロードしようとしたときに発生し、データベースを更新する必要がありました。

SELECT 0を呼び出してデータベースをインスタンス化することで解決しました。データベースが更新されるので、その後、新しいデータをダウンロードしようとします。そして、うまくいきました。

0
IgniteCoders