Android SQLite泄露错误

时间:2013-04-25 05:56:18

标签: android database sqlite

我在应用程序中设置了数据库连接,但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 个答案:

答案 0 :(得分:1)

您的问题是,一旦完成数据库操作,您必须"Close"数据库。无论你打开数据库的哪个位置,都要关闭数据库。

答案 1 :(得分:1)

您正在使用的这个DBAdapter类是什么?我不知道它在做什么,所以我不知道它是否正确。您应该检查错误消息引用的SQLiteConnection对象的位置,并确保该SQLiteConnection是关闭的()d。

您是偶尔还是偶尔收到错误?它可能不是您正在观察的主要问题,但是当close()之前存在异常时,您的代码也无法调用close()。你应该通过try / finally块保护close(),无论异常路径如何都会被调用:

dba.open();
try {
  Cursor c = ...;
  try {
    ...
  } finally {
    c.close();
  }
} finally {
  dba.close();
}

答案 2 :(得分:1)

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

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

替换为以下内容;

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

答案 3 :(得分:0)

public DBAdapter open() throws SQLException {
    db = DBHelper.getWritableDatabase();
//You should close the opened database
DBhelper.close
    return this;

一旦打开它,它也适用于光标,需要关闭。