2012-03-03 51 views
2

我想知道我應該在AsyncTaskLoader中打開/關閉我的SQLiteDatabase連接。我不覺得我完全理解Loader的生命週期,所以如果我不這樣做,我恐怕會碰到一些內存泄漏/ NullPointerExceptions。我目前打開我的裝載程序的構造函數中的SQLiteDatabase:如何在AsyncTaskLoader中處理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(); 
    } 

    .... 

} 

但是我又在哪裏關閉連接?

回答

2

best way很可能會採取的CursorLoader.java副本,並修改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; 
} 
+0

所以我應該打開DB,搶我的光標,然後關閉數據庫都在loadInBackground() ? – 2012-03-03 14:40:29

+1

根本不應該關閉SQLiteDatabase實例。 ContentProvider通常不會這樣做。如果您清楚地指出要銷燬所有使用SQLite數據庫的Activity和s資源,則應關閉數據庫,最重要的是關閉SQLiteOpenHelper **實例。 – Jens 2012-03-03 14:57:02

+0

所以如果我使用SQLiteOpenHelper打開我的數據庫,它會自動將自己綁定到活動生命週期? – 2012-03-03 14:58:52