CursorLoader не обновляется после изменения данных
Я создал небольшое приложение, пытаясь понять функциональность классов LoaderManager
и CursorLoader
.
Я реализовал LoaderCallbacks<Cursor>
в моем классе FragmentActivity
, и все работает отлично, за исключением того факта, что когда я обновляю свои данные с помощью методов ContentResolver.update()
или ContentResolver.insert()
, onLoadFinished()
не вызывается и как результат мои данные не обновляются.
У меня есть пользовательский ContentProvider, и мне интересно, не проблема в моем ContentProvider, не уведомляющая, что данные изменились или что-то еще.
Ответы
Ответ 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)
и какое отношение между ними? Спасибо