Я изучил, как использовать ContentProviders
и загрузчики из этого руководства.
Как я это вижу: у нас есть Activity
с ListView
, SimpleCursorAdapter
и CursorLoader
. Мы также реализуем ContentProvider
.
В Activity
мы можем вызвать getContentResolver().insert(URI, contentValues);
нажатием кнопки.
В нашей реализации ContentProvider
в конце метода insert()
мы вызываем getContentResolver().notifyChange(URI, null);
, и наш CursorLoader
получит сообщение о том, что он должен перезагрузить данные и обновить пользовательский интерфейс. Также, если мы используем FLAG_REGISTER_CONTENT_OBSERVER
в SimpleCursorAdapter
, он также получит сообщение и будет вызван его метод onContentChanged()
.
Таким образом, наш ListView будет обновляться, если мы вставляем, обновляем или удаляем данные.
Activity.startManagingCursor(cursor);
устарела, cursor.requery()
устарела, поэтому практического смысла от cursor.setNotificationUri()
не вижу.
Я просмотрел исходный код метода setNotificationUri()
и увидел, что он вызывает mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver)
внутри метода. Также CursorLoader
делает то же самое. Наконец, курсор получит сообщение, и внутри курсора будет вызван следующий метод:
protected void onChange(boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange, null);
// ...
}
}
Но я не могу понять это.
Итак, мой вопрос: почему мы должны вызывать cursor.setNotificationUri()
в методе query()
нашей реализации ContentProvider
?