Афоризм
Да, невесёлым получился некролог.
Наталья Резник
Последние статьи

 • RawContacts
Необработанные контакты в Android
 • javax.crypto.Cypher
Cимметричное шифрование и дешифрирование
 • Random, Math.random
Генерация случайных чисел
 • Компонент JDatePicker
Описание и пример компонента JDatePicker
 • Компонент Tree
Описание и пример дерева Tree библиотеки base-gui
 • Grid с навигатором
Описание и пример Gridp с навигатором
 • Компонент Grid
Описание и пример Grid библиотеки base-gui
 • Библиотека base-gui
Описание компонентов библиотеки base-gui
 • Оператор SELECT
Использование SQL-оператора SELECT

Необработанные контакты в Android

В предыдущей статье описания контактов в ОС Android была рассмотрена общая структура контактов. В данной статье рассмотрим структуру необработанных контактов.

Как было отмечено ранее основная информация о контактах в устройстве хранится в трех основных таблицах : ContactsContract.Contacts, ContactsContract.RawContacts и ContactsContract.Data. Остальные таблицы класса ContactsContract представляют собой вспомогательные таблицы, которые поставщик контактов использует для управления своими операциями или поддержки определенных функций, имеющихся в приложении устройства «Контакты» или приложениях для телефонной связи.

В таблице Contacts хранятся данные о пользователях, полученные путем агрегации строк необработанных контактов, поступающие от одного аккаунта определенного типа. В связи с тем, что в качестве источника данных о пользователе в поставщике контактов может выступать сразу несколько online-служб, то для одного и того же пользователя в поставщике контактов может существовать несколько необработанных контактов, регистрируемых в таблице RawContacts. Это позволяет объединять пользовательские данные из нескольких аккаунтов одного и того же типа. То есть, записи таблицы Contacts имеют связь с записями таблицы RawContacts в виде отношения один-ко-многим.

Бо́льшая часть данных необработанного контакта хранится не в таблице RawContacts, а в таблице Data. Связь между записями RawContacts и Data также имеет отношение один-ко-многим. Т.е. в таблице Data хранятся непосредственно данные о контакте. Каждая строка данной таблицы представляет набор данных определенного типа, определяемого столбцом mimetype_id, хранящего идентификатор id типа данных из таблицы mimetype (например, vnd.android.cursor.item/name, vnd.android.cursor.item/photo). Кроме этого, в каждой строке данных имеется столбец Data.RAW_CONTACT_ID, в котором содержится значение его родительской строки RawContacts._ID.

В следующей таблице представлены столбцы RawContacts, имеющие важное значение :

ACCOUNT_NAME Имя аккаунта, выступающего в роли источника данных для необработанного контакта. Например, имя аккаунта Google является одним из эл. адресов почты Gmail владельца устройства. Формат имени зависит от типа аккаунта; это не обязательно адрес email.
ACCOUNT_TYPE Тип аккаунта, выступающего в роли источника данных для необработанного контакта. Например, тип аккаунта com.google для имени Google. Следует всегда указывать тип аккаунта и идентификатор домена. Это гарантирует уникальность типа Вашего аккаунта. У типа аккаунта, выступающего в роли источника данных контактов, обычно имеется связанный с ним адаптер синхронизации, который синхронизирует данные с поставщиком контактов.
DELETED Флаг удаления необработанного контакта, позволяющий поставщику контактов хранить строку внутри себя до тех пор, пока адаптеры синхронизации не смогут удалить эту строку с серверов, а затем удалить ее из репозитория.

Важные примечания к таблице RawContacts :

  1. Имя необработанного контакта хранится в таблице Data в строке ContactsContract.CommonDataKinds.StructuredName. У необработанного контакта в таблице Data имеется только одна строка такого типа.
  2. Чтобы использовать в строке необработанного контакта данные собственного аккаунта, необходимо его сначала зарегистрировать в классе AccountManager. Для этого следует добавить тип аккаунта и его имя в список аккаунтов. Если этого не выполинть, то поставщик контактов автоматически удалит строку необработанного контакта.
    Например, если необходимо, чтобы в приложении хранились данные контактов для веб-службы в домене «ru.java-online.service», и аккаунт пользователя службы выглядит следующим образом : «eleonore@service.java-online.ru», то пользователю сначала необходимо добавить «тип» аккаунта («ru.java-online.service») и его «имя» («eleonore@service.java-online.ru») прежде чем приложение сможет добавлять строки необработанных контактов. При инсталляции приложения можно предложить пользователю добавить тип и имя своего аккаунта.

Источники данных необработанных контактов

Чтобы понять, что такое необработанный контакт, рассмотрим пример с Eleonore Dickins, имеющую следующие аккаунты : два email и учетную запись в Twitter :

  • eleonore.dickins@gmail.com;
  • eleonored@gmail.com;
  • аккаунт news-sh в Twitter.

Eleonore включила функцию «Синхронизировать» контакты для всех трех этих аккаунтов в настройках «Аккаунты».

Предположим, что Eleonore открывает свой почтовый ящик Gmail под именем eleonore.dickins@gmail.com. После этого открывает «Контакты» и добавляет новую запись Sherlok Holms, имеющего аккаунт «sherlok-holms» в Twitter. Несколько позже она снова открывает Gmail, но под именем eleonored@gmail.com и отправляет письмо пользователю Sherlok Holms, который автоматически добавляется в её «Контакты». Кроме этого, она подписана на новости «news-sh» в Twitter от «sherlok-holms».

В результате выполнения этих действий поставщик контактов создаст три необработанных контакта :

  1. Контакт Sherlok Holms связан с аккаунтом eleonore.dickins@gmail.com. Тип аккаунта — Google.
  2. Второй необработанный контакт Sherlok Holms связан с аккаунтом eleonored@gmail.com. Тип аккаунта — Google. Второй необработанный контакт создается несмотря на то, что его имя полностью совпадает с именем предыдущего контакта, поскольку первый был добавлен для другого аккаунта (email).
  3. Третий необработанный контакт Sherlok Holms связан с аккаунтом news-sh. Тип аккаунта — Twitter.

На следующем рисунке представлены взаимосвязи этих трех таблиц для приведенных выше записей аккаунтов.

Таблица данных

Как было отмечено выше, записи необработанного контакта хранятся в Data, и имеют связь со значением _ID необработанного контакта. Это позволяет для одного необработанного контакта иметь несколько экземпляров одного и того же типа данных, например, адресов эл. почты или номеров телефонов.

В таблице ContactsContract.Data хранится информация об имени, номере, эл.почте, почтовом адресе, фото. Для управления данными в таблице ContactsContract.Data предусмотрены столбцы с описательными именами, а также столбцы с универсальными именами.

Содержимое в столбце с описательным именем имеет то же значение, независимо от типа данных

RAW_CONTACT_ID
Значение в столбце _ID необработанного контакта.

MIMETYPE
Типы MIME определены в подклассах класса ContactsContract.CommonDataKinds. Они являются открытыми, и их может использовать любое приложение, в том числе и поставщик контактов, а также адаптер синхронизации, взаимодействующий с поставщиком контактов.

IS_PRIMARY
Если необработанный контакт имеет ссылки на несколько строк данных, то в столбце IS_PRIMARY можно пометить основную строку значением, отличным от нуля, которая будет использоваться/предлагаться по умолчанию. Для этого, например, пользователь может нажать и, удерживая номер телефона контакта, выбрать параметр «Использовать по умолчанию»; в столбце ContactsContract.Data с этим номером телефона будет установлено значение IS_PRIMARY, отличное от нуля. отличное от нуля.

Универсальные столбцы

С универсальными именами имеется 15 общедоступных столбцов : DATA1–DATA15. Адаптеры синхронизации используют четыре дополнительных столбца : SYNC1–SYNC4.

Столбец DATA1 является индексируемым. Поставщик контактов предполагает, что данные этого столбца будут наиболее часто являться целевыми в запросах. Cтолбец DATA15 обычно зарезервирован для данных больших двоичных объектов (BLOB), таких как миниатюры фотографий.

Связанные страницы

Основы Contacts API в Android

  Рейтинг@Mail.ru