数据更改后CursorLoader不更新

我创build了一个小应用程序,试图了解LoaderManagerCursorLoader类的function。

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

我有一个自定义ContentProvider,我想知道如果问题是在我的ContentProvider不通知数据改变或其他。

您在ContentProvider.query()返回之前是否在Cursor上调用了setNotificationUri(ContentResolver cr, Uri uri) ContentProvider.query()

你是否在ContentProvider的'insert'方法中调用了getContext().getContentResolver().notifyChange(uri, null)

编辑:

ContentProvider调用getContext().getContentResolver()来调用ContentResolver

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

接受的答案是有点棘手的理解,所以我正在写答案,以方便其他开发人员..

  1. 转到您已经扩展了ContentProvider
  2. find具有以下语法的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; }`