【问题标题】:CursorLoader not refreshing on data changeCursorLoader 不刷新数据更改
【发布时间】:2016-01-28 14:18:14
【问题描述】:

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

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

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

【问题讨论】:

  • 你要关闭光标吗?
  • 不,我没有关闭光标。我将把它添加到问题中。

标签: android android-contentprovider android-cursorloader android-loadermanager


【解决方案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;

【讨论】:

  • 谢谢,这有效,这是一个非常明显的错误,我完全错过了。我想我需要休息一下。
猜你喜欢
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2021-10-15
相关资源
最近更新 更多