49

我创建了一个小型应用程序,试图了解LoaderManagerand类的功能CursorLoader

我已经LoaderCallbacks<Cursor>在我的FragmentActivity-class 上实现了,一切正常,除了当我通过ContentResolver.update()or ContentResolver.insert()-methods 更新我的数据时,onLoadFinished()没有调用,因此我的数据没有更新。

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

4

3 回答 3

106

你在退货之前打电话setNotificationUri(ContentResolver cr, Uri uri)了吗?CursorContentProvider.query()

你有没有调用你getContext().getContentResolver().notifyChange(uri, null)的“插入”方法ContentProvider

编辑:

ContentResolvergetContext().getContentResolver()ContentProvider.

于 2011-10-27T11:18:38.323 回答
5

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

于 2016-09-28T11:49:21.463 回答
4

接受的答案有点难以理解,所以我写答案是为了让其他开发人员更容易理解。

  1. 转到您已扩展的课程ContentProvider
  2. 查找具有以下语法的 query() 方法

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

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

    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;
}`
于 2017-02-22T12:01:43.497 回答