Разница между ContentObserver и DatasetObserver? - PullRequest
31 голосов
/ 25 марта 2011

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

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

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

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

Ответы [ 4 ]

29 голосов
/ 13 апреля 2011

Если вы используете 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's 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);

Этот подход является хорошим примером модели наблюдателя объектно-ориентированного проектирования.

5 голосов
/ 27 июля 2016

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

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

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

2 голосов
/ 03 апреля 2016

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

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

1 голос
/ 17 июля 2013

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

...