Android SQLiteDatabase和Cursor泄漏和close()调用
我需要一些关于数据库和光标管理的帮助。我注意到,当进入/离开某些片段时,我得到: W/SQLiteConnectionPool﹕ 数据库“+数据+数据+数据库”的SQLiteConnection对象泄漏!请修复应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库 这让我从头开始检查我在做什么,什么时候做。我有: 扩展SQLiteOpenHelper的DatabaseHelper类,只包含一些用于创建和更新db的方法; DatabaseManager类,不扩展任何内容。除其他外,我使用它来保持对DatabaseHelper对象的单个引用: 在这个类中,一些查询数据库并返回游标对象的方法 在这个类中,有一个closeConnection方法,我不太确定 我从片段中使用这个类,每次调用新的DatabaseManagergetActivity。这不应创建新的帮助器引用。现在我是: 从查询中获得所需信息后,立即调用Cursor.close; 从不在助手上调用open,也不在SQLiteDatabase上调用open,尽管我在某个地方读到了应该这样做的内容。具体什么时候?为什么不用打电话就可以工作? 在使用我的数据库的片段的onStop方法中调用manager.closeConnection。如您所见,这在对helper类的引用和可读的SQLiteDatabase对象上调用close。但是,我并不确定这一点,因为它关闭了helper引用h而没有将其设置为null,所以将来调用新的DatabaseManager时可能会出现一些问题?也许用单例模式处理数据库不需要调用h.close? 除此之外,不用说这就是为什么我要问,当切换片段时,我得到了上面提到的警告。发生了什么?我该怎么办?正在进行的结束事务意味着什么?我应该修改closeConnection方法,在不同的生命周期中调用它,还是根本不调用它Android SQLiteDatabase和Cursor泄漏和close()调用,android,android-sqlite,android-database,Android,Android Sqlite,Android Database,我需要一些关于数据库和光标管理的帮助。我注意到,当进入/离开某些片段时,我得到: W/SQLiteConnectionPool﹕ 数据库“+数据+数据+数据库”的SQLiteConnection对象泄漏!请修复应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库 这让我从头开始检查我在做什么,什么时候做。我有: 扩展SQLiteOpenHelper的DatabaseHelper类,只包含一些用于创建和更新db的方法; DatabaseManager类,不扩展任何内容。除其他外,我使用它来保
在@Selvin指出了令人尴尬的问题后,我做了h静态。现在,如果我删除对closeConnection的任何调用,它都可以正常工作,并且不会收到任何警告。这意味着我永远不会给h.close或db.close打电话。可以吗?如果不是,我应该什么时候调用它?我从片段中使用这个类,每次调用新的DatabaseManagergetActivity。这不应创建新的帮助器引用。。。不正确…我在某处发现了该模式,现在将在DatabaseHelper中实现getInstance来修复它。谢谢。私人数据库助手;应该是静态的。。。但更好的办法是使整个DatabaseManager类成为一个单独的类,甚至更好。。。使用ContentProvider。。。ConterProvider应该有助于处理SQLiteDatabase泄漏。。。加载器API应该对游标有帮助leaks@Selvin除了ContentProvider,DatabaseHelper不应该是一个单例吗?为什么DatabaseHelper和DatabaseManager基本上都保持对helper的单一静态、现在的引用?我应该把两者合并吗?
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();
}
}