CursorLoader 不刷新数据更改

CursorLoader not refreshing on data change

android 的 CursorLoader 有点问题。我正在使用 CursorLoader 从我自己的 ContentProvider 加载数据。它可以很好地加载数据并保持方向变化,但不会根据数据变化进行更新。顺便说一句,我使用的是兼容库中的 CursorLoader。

我想我已经完成了文档和几个教程告诉我要做的所有事情,但仍然无法正常工作。我检查了该网站上的几个帖子,但似乎没有解决问题。

这是我创建加载程序的地方:

@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 的 delete 方法上调用的方法:

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,在我的查询上调用 setNotificationUri() 并在删除方法上调用 notifyChange() 以传递相同的 Uri,但 onLoadFinished() 不会在数据更改时触发。而且我不会在任何地方关闭光标。

作为解决方法,我手动重新启动加载程序,但这超出了将 CursorLoader 与 LoaderManager 一起使用的目的。

我没有使用 CursorAdapter,我将我在 onLoadFinished() 中获得的数据放在一个 Evidence 对象中,然后将该对象插入到一个列表中,该列表是绑定到一个自定义适配器的数据源网格视图。我这样做是因为我需要将其他数据添加到游标中不存在的证据对象。

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

您没有返回调用 setNotificationUri 的 Cursor。您正在返回第二个 rawQuery 游标。你想要的是:

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