-1

アプリケーションでデータベース接続をセットアップしましたが、LogCat が SQLite リークについて教えてくれます

04-25 11:22:23.771: W/SQLiteConnectionPool(9484): A SQLiteConnection object for database '+data+data+com_appstart+databases+database' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.

データベース アダプタの使用方法に問題があるのではないかと考え始めています。私は自分のコードを添付します...これは私のコードで、時々見つけてエラーが発生しました..

try{

    DBAdapter dba = new DBAdapter(this);
    dba.open();

    Cursor c = dba.getModules(Constant.LANGUAGE_ID);

    for (int i = 0; i < c.getCount(); i++) {
        if (i > 2) {

            a.add(c.getString(2));
            moduleid.add(c.getString(0));
            icon_name.add(c.getString(1));

            System.out.println(c.getString(2) + "------" + c.getString(0));

        }
        c.moveToNext();
    }

    c.close();
    dba.close();
}catch(Exception e){
    e.printStackTrace();
}

これは、Open() メソッドと Close() メソッドを含む DBAdapter クラスです。

public DBAdapter open() throws SQLException {
    db = DBHelper.getWritableDatabase();
    return this;
}
public void close() {
    DBHelper.close();
}
4

4 に答える 4

1

使用しているこの DBAdapter クラスは何ですか? それが何をしているのかわからないので、それが正しいかどうかはわかりません。エラー メッセージが参照している SQLiteConnection オブジェクトがどこで取得されているかを確認し、SQLiteConnection が close()d であることを確認する必要があります。

エラーが発生するのは、ときどきですか、それとも常にですか? これはおそらくあなたが観察している主な問題ではありませんが、close() の前に例外がある場合、コードは close() の呼び出しにも失敗します。try/finally ブロックで保護することにより、例外パスに関係なく close() が呼び出されるようにする必要があります。

dba.open();
try {
  Cursor c = ...;
  try {
    ...
  } finally {
    c.close();
  }
} finally {
  dba.close();
}
于 2013-04-25T06:23:25.867 に答える
1

あなたの問題は"Close"、データベース操作が完了したら、データベースにアクセスする必要があることです。したがって、DBを開いた場所でDBを閉じます。

于 2013-04-25T06:01:45.197 に答える
0
public DBAdapter open() throws SQLException {
    db = DBHelper.getWritableDatabase();
//You should close the opened database
DBhelper.close
    return this;

カーソルを開いた後は、閉じる必要があります。

于 2016-07-26T04:15:13.337 に答える