Подтвердить что ты не робот

Понимание архитектуры Android-контактов

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

Итак, я прочитал несколько сообщений. Итак, информация, которую я собрал,

Мы можем получать уведомления через наблюдателей Content при каждом изменении контактов. Но мы не можем получить, какие контакты были добавлены/обновлены/удалены. Поэтому я прочитал официальный apis и подготовил свой проект, как захватить этот конкретный контакт.

Итак, что я думал в начале

  • Мы будем хранить все идентификаторы контактов, удаленный флаг и версию
  • Всякий раз, когда контакты меняются, я получаю счетчик строк в таблице и количество строк в системе Android.
  • Если мой номер строки меньше, чем число строк в системе, контакт удаляется.
  • Если число строк больше, чем число строк в системе, добавлен контакт.
  • И если это не так, то одна из версий контактов была изменена.

Затем я узнал, что Android не удаляет контакт, если он удаляется пользователем, но он устанавливает 0 на удаленный флаг. Поэтому в этих случаях количество строк будет таким же.

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

Поэтому я просто хочу знать, что я считаю правильным или нет. И в случае добавления контакта добавляется ли она в последнюю строку курсора или нет, если я проверю последнюю строку системной базы данных для контактов, она даст мне контакт, добавленный или нет.

Пожалуйста, помогите мне понять архитектуру контактов Android.

4b9b3361

Ответ 1

Позвольте мне объяснить как можно больше. В основном ваша политика выглядит неплохо, но на самом деле она немного сложнее, чем вы думали.

В Android связь может быть связана с несколькими необработанными контактами, которые могут предоставляться от многих поставщиков данных, таких как Google, Facebook, Skype и т.д. Например, если один из ваших друзей в ваших локальных контактах также использует Skype, в ContactContracts.RawContacts есть два необработанных контакта, но они будут агрегированы автоматически и отображаются как один контакт, когда вы запрашиваете ContactsContract.Contacts.

Именно поэтому трудно идентифицировать контакт уникально, потому что вы можете разбить или присоединиться к ним в любое время. LOOKUP_KEY для этого случая не очень удобно.

Многие приложения, кроме Google, обеспечивают одностороннюю синхронизацию, т.е. только от службы к контактам, поэтому они доступны только для чтения. В этом случае удаленный флаг не будет использоваться и просто удален во время процесса синхронизации. Таким образом, вы не можете просто полагаться на флаг.

Несмотря на то, что нет простого простого решения, я думаю, что намного проще добиться того, чего вы хотите, если вы наблюдаете за конкретным RawContacts, а не Contacts. Надеюсь, это поможет вам понять.

Ответ 2

Я считаю, что наилучшей практикой является мониторинг всякий раз, когда контакт объединяется с другим и идентифицирует их по имени contactName, а не _ID или CONTACT_ID. Взгляните на возможные операции с контактами:

Вставить

Контакт не может быть создан явно. Когда вставлен сырой контакт, поставщик сначала попытается найти Контакт, представляющий одного и того же человека. Если он найден, столбец CONTACT_ID исходного контакта получает _ID совокупного контакта. Если совпадение не найдено, поставщик автоматически добавляет новый контакт и помещает его _ID в столбец CONTACT_ID недавно вставленного сырого контакта.

Обновление

Могут быть изменены только определенные столбцы Contact: TIMES_CONTACTED, LAST_TIME_CONTACTED, STARRED, CUSTOM_RINGTONE, SEND_TO_VOICEMAIL. Изменение любого из этих столбцов на контакте также изменяет их на все исходные необработанные контакты.

Удалить

Будьте внимательны при удалении контактов! При удалении агрегированного контакта удаляются все исходные необработанные контакты. Соответствующие адаптеры синхронизации замечают удаление своих соответствующих сырых контактов и удаляют их из хранилища на задней панели.

Query

Если вам нужно прочитать индивидуальный контакт, используйте CONTENT_LOOKUP_URI вместо CONTENT_URI. Если вам нужно найти контакт по номеру телефона, используйте PhoneLookup.CONTENT_FILTER_URI, который оптимизирован для этой цели. Если вам нужно найти контакт с помощью частичного имени, например. для создания предложений типа "фильтр-как-вы" используйте URI CONTENT_FILTER_URI. Если вам нужно найти контакт с каким-либо элементом данных, таким как адрес электронной почты, псевдоним и т.д., Используйте запрос к таблице ContactsContract.Data. Результат будет содержать идентификатор контакта, имя и т.д.


Проблема заключается в том, что у вас может быть два "Phillip Morris" в вашем списке контактов, которые не являются одним и тем же человеком.

Для получения дополнительной информации см. этот раздел документации по классам Android

Надеюсь, что это поможет.