Разница между ContentObserver и DatasetObserver?
В чем разница между ContentObserver
и DatasetObserver
?
Когда тот или иной должен использоваться?
Я получаю Cursor
с одной строкой. Я хочу получать уведомления об изменениях данных - например. когда строка обновляется.
Какой класс наблюдателя я должен зарегистрировать?
Ответы
Ответ 1
Если вы используете ContentProvider
(через ContentResolver
или Activity.managedQuery()
), чтобы получить свои данные, просто прикрепите ContentObserver
к Cursor
. Код в onChange()
будет вызываться всякий раз, когда ContentResolver
передает уведомление для Uri
, связанное с вашим курсором.
Cursor myCursor = managedQuery(myUri, projection, where, whereArgs, sortBy);
myCursor.registerContentObserver(new ContentObserver() {
@Override
public void onChange(boolean selfChange) {
// This cursor Uri has been notified of a change
// Call cursor.requery() or run managedQuery() again
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
}
Убедитесь, что ваш ContentProvider
является "хорошим гражданином" и регистрирует Uri
с помощью курсора после запроса:
cursor.setNotificationUri(getContentResolver(), uri);
Он также должен уведомить ContentResolver
о любых изменениях базовых данных (например, во время операций вставки, удаления и обновления в вашей базе данных SQLite):
getContentResolver().notifyChange(uri, null);
Этот подход является хорошим примером шаблона Observer объектно-ориентированного дизайна.
Ответ 2
Я не уверен, что этот вопрос по-прежнему находится на любом радаре. Я немного борюсь с тем же вопросом. То, что я придумал, как мой экзамен лакмусовой бумажки для принятия решения о том, использовать ли DataSet Observer или ContentObserver, довольно прямолинейно:
Если мне нужно отправить URI в мое уведомление, я использую ContentObserver. Если мне просто нужно уведомить один объект, который изменил другой объект, я использую DataSetObserver.
Фактор разграничения, по крайней мере, для меня - это то, что объект, который отправляет уведомление, подвергает его лежащим в основе ресурсам (будь то объекты, записи, запросы или курсоры) как "универсальные идентификаторы ресурсов" для остальной части приложения; или объект скрывает источник своих данных.
Ответ 3
Чтобы предоставить дополнение к ответу ptc, DataSetObserver
используется для обработки изменений контента в Adapter, например, это можно использовать для динамического обновления списка с помощью адаптера. Вы можете зарегистрировать DataSetObserver
с помощью метода Adapter#registerDataSetObserver()
.
DataSetObserver
также может использоваться для наблюдения за изменениями контента в Cursor аналогичным образом.
Ответ 4
Из моего последнего приложения, которое я могу сказать, я могу сказать.
Основное различие между ContentObserver и DataSetObserver заключается в том, что ContentObserver делает Observer любые изменения, влияющие на ContentProvider. С другой стороны, DataSetObserver Observer оказывает какое-либо влияние на изменение базы данных.