Контракт контактов Android: возможно ли получить уникальный идентификатор строки данных? - PullRequest
0 голосов
/ 27 августа 2018

Итак, теперь я знаю, что контакты сохраняются в трех таблицах:

  • Таблица контактов.
  • Таблица необработанных контактов.
  • Таблица данных.

Таблица, которую я использую:

Я использую таблицу данных для чтения пользователей со всеми их телефонными номерами в соответствии с @marmor и благодаря этому ответ .

Что я получил из решения по приведенной выше ссылке:

Используя ответ, предоставленный @marmor в приведенной выше ссылке, я смогзапрос (для всех контактов в телефонной книге) contact_id, сопоставленный с set of phone numbers для этого конкретного контакта.

Определение contact_id и набора телефонных номеров:

  • contact_id: идентификатор контакта в телефонной книге, который может содержать несколько типов связанных учетных записей.

  • set of phone numbers: набор, содержащий всеномера телефонов определенного contact_id.

Проблема:

Допустим, у меня есть два пользователя X и Y:

пользователь xhкак contact_id = 0.

пользователь y имеет contact_id = 1.

Теперь предположим, что у пользователя x есть следующие номера: + 1111-xxx и + 2222-xxx

И предположим, что у пользователя y связаны следующие номера: + 3333-xxx и + 2222-xxx

Теперь я решил сохранить все эти номера в локальной базе данных на телефоне:

case 1:

Если я использовал номера этих пользователей в качестве основного идентификатора для сохранения в базе данных, то + 2222-xxx для пользователя x заменит + 2222-xxx для пользователя y.

case 2:

Если я использовал contact_id в качестве основного идентификатора для сохранения в базе данных, то + 1111-xxx и + 2222-xxx, что соответствует тому же user_id (0)оба будут перезаписаны, поэтому один из них выиграет.

case 3:

Если используется комбинация номер телефона + contact_id в качестве основного идентификатора для сохранения в базе данных, а затем какможет работать, кажется, не очень чистое решение и не стабильный.

Вопрос:

Можно ли получить уникальный идентификатор?Как идентифицировать каждый номер, найденный в contact_id?

Спасибо.

1 Ответ

0 голосов
/ 28 августа 2018

A.Определенно возможно получить идентификатор строки данных:

При запросе к Data.CONTENT_URI, просто добавьте Data._ID к вашей проекции, и тогда вы сможете получить конкретный идентификатор данных и делать все, что захотитес ним.

B.Разумно ли сохранять идентификатор данных в вашей БД в качестве ключа комбинации контакт / номер?Нет.

Идентификаторы данных могут изменяться с течением времени, и гарантированно их непротиворечивость не гарантируется, поэтому настоятельно рекомендуется сохранять их в локальной БД и использовать их в качестве долгосрочного идентификатора.

С.Что вы можете сделать вместо этого?

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

Просто разрешите соединение «один ко многим» между вашей клавишей - номером телефона - и контактами.Таким образом, один телефонный номер X может указывать на 0 или более различных контактов, которые в настоящее время имеют этот номер в своих строках данных.

Вам необходимо периодически запускать (например, один раз в день), чтобыобновите внутреннюю БД с изменениями из базы данных контактов устройства.

...