我在应用程序中设置了数据库连接,但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();
}
答案 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;
一旦打开它,它也适用于光标,需要关闭。