我遇到了一些與Android的CursorLoader有關的問題。我使用CursorLoader從我自己的ContentProvider加載數據。它可以很好地加載數據並保持方向更改,但不會更新數據更改。順便說一句,我使用兼容庫中的CursorLoader。CursorLoader不會刷新數據變化
我想我已經完成了文檔和幾個教程告訴我要做的所有事情,但它仍然無法正常工作。我檢查了這個網站上的幾個帖子,但nothig似乎修復它。
這裏是我創建的裝載機:
@Override
public Loader onCreateLoader(int id, Bundle args) {
switch (id) {
case TODO_EVIDENCES_LOADER_ID: {
return new CursorLoader(this, BuilderToDoContentProvider.TODO_EVIDENCES_CONTENT_URI, null, null, new String[]{token_id}, null);
}
}
return null;
}
這是我的查詢方法調用我的ContentProvider方法:
private Cursor getToDoEvidences(String selection){
String evidenceQuery = "SELECT " + BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._ID + ", " +
BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._PATH + ", " + BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._TIMESTAMP + ", " +
BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._TYPE +
" FROM " + BuilderToDoContract.Evidence.TABLE_NAME + " WHERE " + selection;
Cursor result = database.rawQuery(evidenceQuery, null);
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI);
return database.rawQuery(evidenceQuery, null);
}
這是我上的刪除方法調用的方法我的ContentProvider:
private int deleteEvidence(String[] selection) {
int result = database.delete(BuilderToDoContract.Evidence.TABLE_NAME, BuilderToDoContract.Evidence._PATH + " = ?" , selection);
getContext().getContentResolver().notifyChange(TODO_EVIDENCES_CONTENT_URI, null);
return result;
}
正如你所看到的,我正在創建CursorLoader,調用s etNotificationUri()對我的查詢和調用notifyChange()的delete方法傳遞相同的Uri,但onLoadFinished()不會觸發數據更改。而且我沒有關閉任何地方的光標。
作爲一種解決方法,我正在手動重新啓動加載程序,但這比使用CursorLoader和LoaderManager的目的要好。我將數據放入證據對象中的onLoadFinished()中,然後將此對象插入列表中,這是綁定到GridView的自定義適配器的數據源。我這樣做是因爲我需要將其他數據添加到不存在於遊標中的Evidence對象。
你是否關閉遊標? – DeeV
不,我沒有關閉光標。我將把它添加到問題中。 –