我需要一些关于数据库和游标管理的帮助。我注意到,当进入/离开某些片段时,我得到:
W/SQLiteConnectionPool:数据库“+data+data+database”的 SQLiteConnection 对象被泄露!请修复您的应用程序以正确结束正在进行的事务并在不再需要时关闭数据库。
这让我从头开始检查我在做什么以及什么时候做的。我有:
- 一个
DatabaseHelper
扩展类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()
如您所见,它调用 closeh
(对帮助程序类的引用)和可读SQLiteDatabase
对象。但是,我对此不太确定,因为它关闭了辅助引用h
而不使其为空,所以将来调用new DatabaseManager()
? 也许用单例模式处理数据库不需要你打电话h.close()
?
除此之外,不用说(这就是我要问的原因),在切换片段时,我会收到上述警告。怎么了?我应该怎么办?是什么end transactions in progress
意思?我应该修改我的closeConnection()
方法,在不同的生命周期时间调用它,还是根本不调用它?
在@Selvin 指出令人尴尬的问题后,我将其设为h
静态。现在,如果我删除对 的任何调用closeConnection()
,一切正常,我不会收到任何警告。这意味着我从不打电话给h.close()
或db.close()
。那样行吗?如果没有,我应该什么时候打电话?