Разница между ContentObserver и DatasetObserver?

В чем разница между ContentObserver и DatasetObserver?

Когда тот или иной должен использоваться?

Я получаю Cursor с одной строкой. Я хочу получать уведомления об изменениях данных - например. когда строка обновляется.

Какой класс наблюдателя я должен зарегистрировать?

4 ответа

Если вы используете 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 объектно-ориентированного дизайна.


Я не уверен, что этот вопрос по-прежнему находится на любом радаре. Я немного борюсь с тем же вопросом. То, что я придумал, как мой экзамен лакмусовой бумажки для принятия решения о том, использовать ли DataSet Observer или ContentObserver, довольно прямолинейно:

Если мне нужно отправить URI в мое уведомление, я использую ContentObserver. Если мне просто нужно уведомить один объект, который изменил другой объект, я использую DataSetObserver.

Фактор разграничения, по крайней мере, для меня - это то, что объект, который отправляет уведомление, подвергает его лежащим в основе ресурсам (будь то объекты, записи, запросы или курсоры) как "универсальные идентификаторы ресурсов" для остальной части приложения; или объект скрывает источник своих данных.


Чтобы предоставить дополнение к ответу ptc, DataSetObserver используется для обработки изменений контента в Adapter, например, это можно использовать для динамического обновления списка с помощью адаптера. Вы можете зарегистрировать DataSetObserver с помощью метода Adapter#registerDataSetObserver().

DataSetObserver также может использоваться для наблюдения за изменениями контента в Cursor аналогичным образом.


Из моего последнего приложения, которое я могу сказать, я могу сказать. Основное различие между ContentObserver и DataSetObserver заключается в том, что ContentObserver делает Observer любые изменения, влияющие на ContentProvider. С другой стороны, DataSetObserver Observer оказывает какое-либо влияние на изменение базы данных.

licensed under cc by-sa 3.0 with attribution.