Когда множество учетных записей имеют один и тот же контакт, может понадобиться отобразить только одно имя, а не повторяющиеся или похожие имена для всех учетных записей. Это делается в Android путем агрегирования контактов в представление, предназначенное только для чтения. Android сохраняет эти агрегированные контакты в таблице по имени contacts. Для заполнения или модификации этой таблицы используются триггеры на таблицах raw_contacts и data.
Перед началом объяснения логики, стоящей за агрегированием, давайте рассмотрим определение таблицы contacts.
Клиенты не обновляют эту таблицу напрямую. После добавления низкоуровневого контакта с сопутствующими деталями Android выполняет поиск других низкоуровневых контактов на предмет выявления похожих. Если таковой найден, Android будет использовать идентификатор агрегированного контакта из обнаруженного низкоуровневого контакта в качестве идентификатора агрегированного контакта для только что добавленного низкоуровневого контакта. В таблице агрегированных контактов новая запись не создается. Если похожих контактов не найдено, Android создаст агрегированный контакт и укажет его идентификатор в добавляемом низкоуровневом контакте.
Для определения подобия между низкоуровневыми контактами Android использует следующий алгоритм.
. Два низкоуровневых контакта имеют совпадающие имена (т.е. имена и фамилии).
. Слова в имени встречаются те же самые, но в разном порядке, например, “имя фамилия”, “имя, фамилия”, “ фамилия, имя”.
. Совпадают сокращенные версии имен, например, “Bob” для “Robert”.
. Если один из низкоуровневых контактов имеет только имя или фамилию, запускается поиск по другим атрибутам, таким как телефонный номер или адрес электронной почты, и в случае нахождения совпадения контакт будет агрегирован.
. Если в одном из низкоуровневых контактов имя или фамилия вообще не указаны, также запускается поиск по другим атрибутам, как на шаге.
Поскольку эти правила являются эвристическими, некоторые контакты могут быть агрегированы ошибочно. Клиентские приложения должны предоставлять механизм для разделения контактов в таких случаях. Обратившись к руководству пользователя Android, легко выяснить, что стандартное приложение по работе с контактами позволяет разделять контакты, если они были объединены по ошибке.
Можно также запретить агрегирование, устанавливая режим агрегирования при вставке низкоуровневого контакта.
Первая константа (AGGREGATION_MODE_DEFAULT) очевидна; она устанавливает нормальную работу агрегирования.
Вторая константа (AGGREGATION_MODE_DISABLED) отключает агрегирование для данного низкоуровневого контакта. Даже если он уже агрегирован, Android изымет его из агрегации и создаст новый идентификатор агрегированного контакта, специально выделенный для этого низкоуровневого контакта.
Третья константа (AGGREGATION_MODE_SUSPENDED) указывает, что даже в случае изменения свойств этого контакта так, что он перестает соответствовать текущему агрегированию, необходимо оставить его привязанным к этому агрегированному контакту.
Последнее замечание касается изменчивой природы агрегированного контакта. Предположим, что имеется уникальный низкоуровневый контакт с именем и фамилией. В данный момент он не соответствует никаким другим низкоуровневым контактам, поэтому он получает свой агрегированный контакт. Идентификатор агрегированного контакта сохраняется в таблице raw_contacts в строке для низкоуровневого контакта.
Однако далее изменяется фамилия низкоуровневого контакта, что делает его похожим на контакты, отличные от текущей агрегации. В таком случае низкоуровневый контакт удаляется из этого агрегированного контакта и перемещается в другой, оставляя текущий агрегированный контакт пустым. В результате идентификатор этого агрегированного контакта будет полностью отброшен, поскольку он не будет соответствовать чему-либо в будущем по причине отсутствия лежащего в основе низкоуровневого контакта.
Таким образом, агрегированный контакт изменчив. Точное значение идентификатора агрегированного контакта не важно и с течением времени может меняться.
Android позволяет несколько упростить дело, предоставляя поле под названием lookup в таблице contacts агрегированных контактов. Поле lookup представляет собой агрегацию (конкатенацию) учетной записи и уникального идентификатора этого низкоуровневого контакта в учетной записи для каждого низкоуровневого контакта. Затем эта информация кодируется, что позволяет передавать ее как параметр URL для извлечения последнего идентификатора агрегированного контакта. Android просматривает, существуют ли идентификаторы низкоуровневых контактов для конкретного ключа поиска (значения в поле lookup). После этого используется наиболее подходящий алгоритм для возврата соответствующего (или, возможно, нового) идентификатора контакта.
В дополнение к исследованиям базы данных contacts давайте рассмотрим пару полезных представлений, относящихся к этой базе данных.
Представление view_contacts
Первым из этих представлений является http://www.hotkontur.ru/bimetallicheskie-radiatory-global-kupit-global-style-500 view_contacts. Хотя существует таблица, хранящая агрегированные контакты (contacts), API-интерфейс не предоставляет прямой доступ к ней. Вместо этого в качестве целевого для чтения агрегированных контактов используется представление view_contacts. Запросы на основе URI вида ContactsContract.Contacts.CONTENT_URI возвращают столбцы представления view_contacts.
Обратите внимание, что это представление комбинирует таблицы contacts и raw_ contacts на основе идентификатора агрегированного контакта.
Представление contact_entities_view
Еще одним полезным представлением является contact_entities_view, которое комбинирует таблицу raw_contacts с таблицей data. Это представление позволяет извлечь за один раз все элементы данных заданного низкоуровневого контакта или даже элементы данных множества низкоуровневых контактов, относящихся к тому же самому агрегированному контакту.
Опубликовал katy
February 19 2015 18:28:31 ·
0 Комментариев ·
3098 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.