-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();
}

这是我的 DBAdapter 类,它包含 Open() 和 Close() 方法。

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

4 回答 4

1

您的问题是,"Close"一旦完成数据库操作,您就必须访问数据库。因此,无论您打开数据库,请关闭您的数据库。

于 2013-04-25T06:01:45.197 回答
1

在 DBAdapter 类中,在关闭函数中从 db.close() 替换 DBHelper.close();

public void close() {
    DBHelper.close();
}

替换为以下内容;

public void close() {
    db.close();
}
于 2013-04-25T07:01:13.380 回答
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 回答
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 回答