数据更改后 CursorLoader 不更新

Posted

技术标签:

【中文标题】数据更改后 CursorLoader 不更新【英文标题】:CursorLoader not updating after data change 【发布时间】:2011-12-16 10:26:03 【问题描述】:

我创建了一个小应用程序,试图了解LoaderManagerCursorLoader-classes 的功能。

我已经在我的FragmentActivity-class 上实现了LoaderCallbacks<Cursor>,一切正常,除了当我通过ContentResolver.update()ContentResolver.insert()-方法更新我的数据时,onLoadFinished() 没有被调用并且作为结果我的数据没有更新。

我有一个自定义的 ContentProvider,我想知道问题是否在于我的 ContentProvider 没有通知数据已更改或其他原因。

【问题讨论】:

您是否在更新/插入 ContentProvider 方法实现中调用 getContext().getContentResolver().notifyChange(Uri,..); ?在从 ContentProvider 中的查询方法返回之前,您是否调用了 cursor.setNotificationUri(getContext().getContentResolver(), uri); 不,我没有,这就是问题所在!谢谢! :) 【参考方案1】:

ContentProvider.query() 中返回之前,您是否在Cursor 上致电setNotificationUri(ContentResolver cr, Uri uri)

您是否在ContentProvider 的“插入”方法中调用了getContext().getContentResolver().notifyChange(uri, null)

编辑:

要在您的ContentProvider 中获得ContentResolver 呼叫getContext().getContentResolver()

【讨论】:

在我关注android dev docs 创建内容提供者时没有提到这一点很烦人 另外,您不应该在 onLoadFinished 的任何时候调用 cursor.close() ,否则您将不会收到对基础数据集的任何进一步更新。 传递给 setNotificationUri() 的 URI 是否与 notifyChange() URI 完全匹配,或者只是必须具有相同的权限或其他什么? URI 必须相等。 @Herrmann 还有什么其他人应该注意的。即:我用相同的URI调用 setNotificationUri(ContentResolver cr, Uri uri) 和 notifyChange(uri, null) 。但是我的列表视图没有更新。【参考方案2】:

还要检查你是否在某个地方调用了 cursor.close(),因为在这种情况下,你取消注册了由 CursorLoader 注册的内容观察者。并且游标的关闭由 CursorLoader 管理。

【讨论】:

这是我的实现中缺少的链接【参考方案3】:

接受的答案有点难以理解,所以我写下答案是为了方便其他开发人员..

    转到您扩展ContentProvider 的课程

    找到具有以下语法的 query() 方法

    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

    在返回光标的地方写下这一行

    cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor;

最后我的查询方法是这样的

@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 

    Cursor cursor;
    cursor = noticeDbHelper.getReadableDatabase().query(
            NoticeContract.NoticeTable.TABLE_NAME,
            projection,
            selection,
            selectionArgs,
            null,
            null,
            sortOrder
    );
    //This line will let CursorLoader know about any data change on "uri" , So that data will be reloaded to CursorLoader
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
`

【讨论】:

以上是关于数据更改后 CursorLoader 不更新的主要内容,如果未能解决你的问题,请参考以下文章

android studio中的cursorLoader

即使应用程序处于非活动状态,CursorLoader 如何自动更新视图?

自定义 CursorLoader 和支持 ListView 的 CursorAdapter 之间的数据不同步

如何在 ViewPager 中使用 cursorLoader?

当 CursorLoader 的构造函数不支持时,如何在 CursorLoader 中使用连接查询

数据更改后Datagrid不更新