0

我遇到了一些與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對象。

+0

你是否關閉遊標? – DeeV

+0

不,我沒有關閉光標。我將把它添加到問題中。 –

回答

1
Cursor result = database.rawQuery(evidenceQuery, null); 
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI); 
return database.rawQuery(evidenceQuery, null); 

您沒有返回您調用setNotificationUri的遊標。您正在返回第二個rawQuery遊標。你想要的是:

Cursor result = database.rawQuery(evidenceQuery, null); 
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI); 
return result; 
+0

謝謝,這工作,這是一個非常明顯的錯誤,我完全錯過了。我想我需要休息一下。 –