2017-02-01 14 views
0

Я создаю приложение для контактов android, поэтому я регулярно читаю контакты пользователя и сохраняю их в своем приложении. Для этого мне нужно полагаться на какой-то ID так что я знаю, какой контакт я должен обновить (или добавить/удалить) в моем приложении и Contacts Provider поставляет некоторым из них:Должен ли я полагаться на SOURCE_ID при чтении контактов Android?

  • CONTACT_ID является совокупным контактом идентификатора ,
  • каждый агрегат контакт состоит из одного или нескольких сырых контактов, каждый со своим собственным RAW_CONTACT_ID,
  • и самое главное, каждый Сырое Контакт имеет SOURCE_ID, который, как предполагается, идентификатор сервера, то есть идентификатор этого контакта на сервере этой учетной записи.

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

Однако, только протокол синхронизации Gmail, похоже, сохраняет обещание, описанное ниже. К сожалению, адаптеров синхронизации Exchange нет, SOURCE_ID изменений, и это определенно не любой идентификатор сервера, так как он имеет небольшое число, например 23:4.

Вопрос: Есть идеи, как преодолеть эту проблему? Правильно ли я использую ID? Сохраняет ли обменный адаптер «постоянный идентификатор сервера» в другом поле?

Документация: SOURCE_IDmust be unique for each account type and should be stable across syncs:

  • Unique: Каждый сырой контакт для учетной записи, должны иметь свой собственный идентификатор источника. Если вы не применяете это, вы вызовете проблемы в приложении . Обратите внимание, что два необработанных контакта для одного и того же типа учетной записи могут иметь одинаковый исходный идентификатор. Например, необработанный контакт «Thomas Higginson» для учетной записи [email protected] разрешен до , имеет тот же идентификатор источника, что и исходный контакт «Thomas Higginson» для учетной записи [email protected]
  • Стабильный: Идентификаторы источников являются постоянной частью данных онлайн-сервиса для сырого контакта. Например, если пользователь удаляет Контакты Storage из настроек Apps и повторно синхронизирует, восстановленные необработанные контакты должны иметь те же исходные идентификаторы, что и раньше. Если вы не применяете это, ярлыки перестанут работать.

ответ

0

Первое, это не очень хорошая идея, чтобы сохранить Id в приложении, и в надежде, что Id не будет меняться с течением времени и быть последовательными. Вы правы в колонке «SOURCE_ID», что он более согласован по сравнению с другими двумя (CONTACT_ID является наиболее хрупким, а «RAW_CONTACT_ID» сохраняется, по крайней мере, до тех пор, пока пользователь не выйдет из учетной записи и не войдет в систему снова).

У нас была синхронизируемая учетная запись с контактами, и мы использовали для хранения unique id в одном из столбцов общего назначения в таблице «raw_contacts» (SYNC1 - SYNC10).Поэтому, хотя Google предлагает, чтобы поставщики учетных записей использовали столбцы базы данных определенным образом, но это полностью зависит от провайдера.

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

Редактировать - вы должны использовать ContactsColumns.LOOKUP_KEY (предыдущий ответ также процитировал то же). В соответствии с документацией Google -

LOOKUP_KEY

Добавлена ​​в уровне API 5 Строки LOOKUP_KEY Непрозрачного значения, которое содержит подсказки о том, как найти контакт, если его строка идентификатор изменен в результате время синхронизации или агрегация.

Константа Значение: «поиск»

https://developer.android.com/reference/android/provider/ContactsContract.ContactsColumns.html#LOOKUP_KEY

Вы можете получить ключ поиска, если у вас есть идентификатор контакта, используя API, при условии. Посмотреть здесь - https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html

+0

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

+0

На ваш вопрос ответил другой ответ. Ключ, который вам нужно использовать, - «Contacts.LOOKUP_KEY». Обычно ключ поиска представляет собой составной ключ, который генерируется из многих компонентов. Я только что отредактировал свой ответ – Dibzmania

1

LOOKUP_KEY - это то, что вы ищете.

LOOKUP_KEY

Непрозрачный значение, которое содержит подсказки о том, как найти контакт, если ее строка ID изменилась в результате синхронизации или агрегации.

Вы должны использовать PAIR из <CONTACT_ID, LOOKUP_KEY> следить за контактами. В нормальном использовании используйте значение CONTACT_ID, но если ваш код подскажет, что CONTACT_ID изменился (либо отсутствует, либо неожиданное имя контакта), вы можете использовать LOOKUP_KEY, чтобы найти новый контакт-идентификатор.

Или вы можете использовать Contacts.getLookupUri(), чтобы получить URI, который вы всегда можете использовать для быстрого поиска контакта независимо от его фактических значений CONTACT_ID или LOOKUP_KEY.

+0

благодарю вас за ответ, но как насчет сценария удаления, повторного добавления учетной записи? Думаю, 'LOOKUP_KEY' изменится, нет? –

+0

LOOKUP_KEY не должен быть стабильным ID, поэтому да, это изменится, но вы всегда можете использовать ** Contacts.getLookupUri (id, key), чтобы получить uri, который указывает на тот же контакт (нет вопрос, каков его новый идентификатор). ключ поиска содержит «подсказки» к системе о том, как найти этот контакт – marmor

+0

спасибо, ладно, дайте мне попробовать –