CursorLoader не обновляется после изменения данных - PullRequest
49 голосов
/ 27 октября 2011

Я создал небольшое приложение, пытаясь понять функциональность классов LoaderManager и CursorLoader.

Я реализовал LoaderCallbacks<Cursor> в своем классе FragmentActivity, и все работает нормально, за исключением того факта, что когда я обновляю свои данные с помощью ContentResolver.update() или ContentResolver.insert() -методов, onLoadFinished() не вызывается, и в результате мои данные не обновляются.Мне интересно, если проблема в моем ContentProvider не уведомляет, что данные изменились или что-то еще.

Ответы [ 3 ]

105 голосов
/ 27 октября 2011

Вы вызывали setNotificationUri(ContentResolver cr, Uri uri) на Cursor перед возвратом в ContentProvider.query()?

И вызывали ли getContext().getContentResolver().notifyChange(uri, null) в методе 'insert' вашего ContentProvider?

РЕДАКТИРОВАТЬ:

Чтобы получить ContentResolver вызов getContext().getContentResolver() в вашем ContentProvider.

4 голосов
/ 28 сентября 2016

Также проверьте, если вы вызываете куда-нибудь cursor.close (), потому что в этом случае вы отменяете регистратор контента, который был зарегистрирован CursorLoader. И закрытие курсора управляется CursorLoader.

3 голосов
/ 22 февраля 2017

Принятый ответ был немного сложен для понимания, поэтому я пишу ответ, чтобы облегчить его другим разработчикам.

  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;
}`
...