Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLiteDatabase和Cursor泄漏和close()调用_Android_Android Sqlite_Android Database - Fatal编程技术网

Android SQLiteDatabase和Cursor泄漏和close()调用

Android SQLiteDatabase和Cursor泄漏和close()调用,android,android-sqlite,android-database,Android,Android Sqlite,Android Database,我需要一些关于数据库和光标管理的帮助。我注意到,当进入/离开某些片段时,我得到: W/SQLiteConnectionPool﹕ 数据库“+数据+数据+数据库”的SQLiteConnection对象泄漏!请修复应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库 这让我从头开始检查我在做什么,什么时候做。我有: 扩展SQLiteOpenHelper的DatabaseHelper类,只包含一些用于创建和更新db的方法; DatabaseManager类,不扩展任何内容。除其他外,我使用它来保

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

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方法,在不同的生命周期中调用它,还是根本不调用它


在@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();
    }
}