SQLiteDatabase和Cursor泄漏和close()调用

时间:2015-04-07 15:33:14

标签: android android-sqlite android-database

我需要一些关于数据库和游标管理的帮助。我注意到,当进入/离开某些片段时,我得到:

  

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()。这可以吗?如果没有,我什么时候打电话给它?

0 个答案:

没有答案