我需要一些关于数据库和游标管理的帮助。我注意到,当进入/离开某些片段时,我得到:
W / SQLiteConnectionPool:数据库' +数据+数据+数据库'的SQLiteConnection对象。被泄露了!请修复您的应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库。
这让我从头开始回头看看我在做什么,什么时候做。我有:
DatabaseHelper
的{{1}}类,只有一些创建和更新数据库的方法; 一个SQLiteOpenHelper
类,什么都不扩展。除其他事项外,我使用它来保持对DatabaseManager
对象的单个引用:
DatabaseHelper
在这个类中,有些方法查询数据库并返回public class DatabaseManager {
private DatabaseHelper h; //class extending SQLiteOpenHelper
public DatabaseManager(Context c) {
if (h==null) {
h = new DatabaseHelper(c.getApplicationContext()); }
public Cursor query(...) {
SQLiteDatabase db = h.getReadableDatabase();
return db.rawQuery(...)
}
public void closeConnection() {
SQLiteDatabase db = h.getWritableDatabase();
db.close();
h.close();
}
}
个对象;
在本课程中采用了Cursor
方法,我并不确定。
我从片段中使用此类,每次调用closeConnection()
。这不应该创建新的帮助器引用。现在我是:
new DatabaseManager(getActivity())
; Cursor.close()
我的SQLiteDatabase,尽管我读到了应该完成的地方。具体什么时候?为什么即使不调用它也能正常工作?open()
方法中调用manager.closeConnection()
。如您所见,该调用在onStop()
(对助手类的引用)和可读h
对象上关闭。但是,我对此并不十分肯定,因为它关闭了帮助引用SQLiteDatabase
而没有将其设为null,因此将来调用h
可能会出现问题?也许使用单例模式处理数据库不需要您调用new DatabaseManager()
?除此之外,不用说(这就是为什么我要问),当切换片段时,我得到了上面提到的警告。怎么了?我该怎么办? h.close()
是什么意思?我应该修改我的end transactions in progress
方法,在不同的生命周期时间内调用它,还是根本不调用它?
在@Selvin指出的令人尴尬的问题之后,我将closeConnection()
设为静态。现在,如果我删除了对h
的任何通话,那么一切正常,我就不会收到任何警告。这意味着我永远不会同时调用closeConnection()
或h.close()
。这可以吗?如果没有,我什么时候打电话给它?