Подтвердить что ты не робот

CursorLoader не обновляется после изменения данных

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

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

У меня есть пользовательский ContentProvider, и мне интересно, не проблема в моем ContentProvider, не уведомляющая, что данные изменились или что-то еще.

4b9b3361

Ответ 1

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

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

EDIT:

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

Ответ 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;
}`

Ответ 4

Может ли кто-нибудь объяснить мне простой способ понять, как работает этот следующий метод

cursor.setNotificationUri(getContext().getContentResolver(), uri);
getContext().getContentResolver().notifyChange(uri, null)

и какое отношение между ними? Спасибо