【发布时间】:2013-08-11 10:11:53
【问题描述】:
我发现了很多类似close the connection 和close the cursor 的东西,但我都做了这些东西。 SQLite 连接仍然泄漏,我收到如下警告:
A SQLiteConnection object for database was leaked!
我有一个数据库管理器,我用以下代码在我的活动中调用它:
DatabaseManager dbm = new DatabaseManager(this);
我的数据库管理器类的代码如下:
public class DatabaseManager {
private static final int DATABASE_VERSION = 9;
private static final String DATABASE_NAME = "MyApp";
private Context context = null;
private DatabaseHelper dbHelper = null;
private SQLiteDatabase db = null;
public static class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//create database tables
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//destroy and recreate them
}
}
public DatabaseManager(Context ctx) {
this.context = ctx;
}
private DatabaseManager open() throws SQLException {
dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
if (!db.isReadOnly()) {
db.execSQL("PRAGMA foreign_keys = ON;");
}
return this;
}
private void close() {
dbHelper.close();
}
}
当我调用数据库方法时,我会做以下事情:
public Object getData() {
open();
//... database operations take place ...
close();
return data;
}
但正如我所说,我仍然收到此 SQLite 连接泄漏警告。
我做错了什么?
【问题讨论】:
-
我认为您只是关闭了 DBHelper,而不是数据库本身
-
我认为你也应该调用 db.close()
-
不管我是否这样做。反正我会收到消息的。但是我在某处读到,当您调用 dbHelper.close() 时,您不需要这样做
-
为什么
DatabaseHelper是静态的?这可能会导致泄漏,因为DatabaseHelper仍然保持与数据库的连接,而左侧没有对DatabasHelper的引用。 -
我删除了静态,但不幸的是它仍然泄漏
标签: android android-sqlite sqliteopenhelper