ContentObserver вызывается даже при отсутствии изменений в курсоре - PullRequest
4 голосов
/ 07 февраля 2012

У меня есть обозреватель контента, который должен получать уведомления при изменении одного из контактов, добавленных моим адаптером синхронизации.Я регистрирую и отменяю регистрацию наблюдателя, выполняя это:

private static final Uri MYAPP_CONTENT_URI = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME, SyncAdapter.MYAPP_ACCOUNT_NAME).appendQueryParameter(RawContacts.ACCOUNT_TYPE, MY_APP_ACCOUNT_TYPE).build();

public static void registerContentObserver() {
    ContentResolver resolver = MyApplication.getAppContext().getContentResolver();
    cursorContacts = resolver.query(MYAPP_CONTENT_URI, null, RawContacts.DELETED + "=0", null, null);
    cursorContacts.registerContentObserver(MYAPP_URI_OBSERVER);
}

public static void unregisterContentObserver() {
    if (cursorContacts != null) {
        cursorContacts.unregisterContentObserver(MYAPP_URI_OBSERVER);
        cursorContacts.close();
    }
}

Проблема в том, что даже когда курсор пуст (getCount возвращает 0) после регистрации наблюдателя, я получаю вызов onChange, что бы я ни делал вродная адресная книга.Не следует ли вызывать наблюдателя, только когда одна из записей в курсоре была изменена?В документации говорится:

Зарегистрировать наблюдателя, который вызывается при изменении содержимого, поддерживающего этот курсор

Что такое содержимое, поддерживающее этот курсор?Я думал, что это был список lookupuri контактов в курсоре, но похоже, что этого достаточно для изменения в ContactsContract.RawContacts.CONTENT_URI.

Я также пытался зарегистрировать одного наблюдателя для каждого Uri,Это не помогает.Хотя документация для ContentResolver.registerContentObserver гласит:

Зарегистрируйте класс наблюдателя, который получает обратные вызовы при изменении данных, идентифицированных данным URI содержимого.

Parameters
        uri  The URI to watch for changes. This can be a specific row URI, or a base URI for a whole class of content. 
        notifyForDescendents  If true changes to URIs beginning with uri will also cause notifications to be sent. If false only changes to the exact URI specified by uri will cause notifications to be sent. If true, than any URI values at or below the specified URI will also trigger a match. 

(я установилnotifyForDescendents в false, но это не должно было вызывать наблюдателей в любом случае).

Что не так?Спасибо, вы

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Поставщик контента должен решить, когда сообщать об изменениях. Для сложных поставщиков контента (таких как поставщик контактов) может быть очень трудно определить все конкретные URI, которые изменяются в результате операции, поэтому они просто сообщают о глобальном изменении, когда что-то происходит.

0 голосов
/ 15 марта 2014

Параметры запроса в вашем Uri, Фрагменте или даже Схеме учитываются, когда происходит сопоставление Obriver Uri. Единственное, что имеет значение, - это Управление Ури и Сегменты Пути. Строгое совпадение слева направо. Я не проверял «*» в сегменте пути для обозначения подстановочного знака, но я подозреваю, что он не будет работать.

Ваш конкретный Обозреватель - ContactsContract.RawContacts.CONTENT_URI, поэтому в любое время, когда содержание любого контакта изменяется по любой причине, ваш Обозреватель срабатывает.

...