Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.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 在AsyncTaskLoader中应如何处理SQLiteDatabase连接?_Android_Asynctaskloader - Fatal编程技术网

Android 在AsyncTaskLoader中应如何处理SQLiteDatabase连接?

Android 在AsyncTaskLoader中应如何处理SQLiteDatabase连接?,android,asynctaskloader,Android,Asynctaskloader,我想知道在AsyncTaskLoader中何时何地打开/关闭SQLiteDatabase连接。我不觉得我完全了解加载程序的生命周期,所以我担心如果我不正确的话,我可能会遇到一些内存泄漏/NullPointerException。我当前在我的加载程序的构造函数中打开了我的SQLiteDatabase: private class SQLiteCursorLoader extends AsyncTaskLoader<Cursor> { private String _query

我想知道在AsyncTaskLoader中何时何地打开/关闭SQLiteDatabase连接。我不觉得我完全了解加载程序的生命周期,所以我担心如果我不正确的话,我可能会遇到一些内存泄漏/NullPointerException。我当前在我的加载程序的构造函数中打开了我的SQLiteDatabase:

private class SQLiteCursorLoader extends AsyncTaskLoader<Cursor> {

    private String _queryString;
    private SQLiteDatabase _db;
    ...

    public SQLiteCursorLoader(Context context, String queryString) {
        super(context);
        _queryString = queryString;
        _db = MySQLiteOpenHelper.getWritableDatabase();
    }

    ....

}
私有类SQLiteCursorLoader扩展了AsyncTaskLoader{
私有字符串_queryString;
私有SQLiteDatabase_db;
...
公共SQLiteCursorLoader(上下文上下文、字符串查询字符串){
超级(上下文);
_queryString=queryString;
_db=MySQLiteOpenHelper.getWritableDatabase();
}
....
}
但是我在哪里再次关闭连接呢?

可能需要复制并修改
loadInBackground()
方法以使用
SQLiteDatabase

/* Runs on a worker thread */
@Override
public Cursor loadInBackground() {
    Cursor cursor = // Your stuff goes here <..>
    if (cursor != null) {
        // Ensure the cursor window is filled
        cursor.getCount();
        registerContentObserver(cursor, mObserver);
    }
    return cursor;
}
/*在工作线程上运行*/
@凌驾
公共游标loadInBackground(){
Cursor=//你的东西放在这里
如果(光标!=null){
//确保光标窗口已填充
cursor.getCount();
registerContentObserver(游标,mObserver);
}
返回光标;
}

因此我应该打开数据库,抓取光标,然后在loadInBackground()中关闭数据库all?您根本不应该关闭SQLiteDatabase实例。ContentProvider通常不会这样做。如果您有一个明确的点,您正在销毁使用SQLite数据库的所有活动和服务的资源,您应该关闭数据库,最重要的是,关闭SQLiteOpenHelper实例。因此,如果我使用SQLiteOpenHelper打开数据库,它将自动绑定到活动生命周期?不,它不会-但请注意-SQLiteOpenHelper不是您应该创建多个实例的对象(在大多数情况下会导致糟糕的结果)-您是否在多个活动中使用数据库?那么您的SQLiteOpenHelper通常应该是一个单实例-并且永远不会关闭。当然,游标和类似的东西应该被关闭。