Сохранение долгосрочной ссылки на запись адресной книги IOS
Учитывая, что ABRecordID может меняться между облачной синхронизацией и при других обстоятельствах вне моего контроля, как я могу поддерживать долгосрочную ссылку на запись адресной книги IOS?
Apple предоставляет следующие рекомендации:
"Рекомендуемый способ сохранить долговременную ссылку на конкретную запись - сохранить имя и фамилию или хэш имени и фамилии в дополнение к идентификатору. Когда вы просматриваете запись по идентификатору, сравните от имени записи к вашему сохраненному имени. Если они не совпадают, используйте сохраненное имя, чтобы найти запись, и сохраните новый идентификатор для записи."
Но я не понимаю этого руководства. Если в адресной книге могут быть повторяющиеся имена И поскольку пользователи могут изменять имя в записи, как этот совет может работать?
Например, если пользователь изменяет имя записи адресной книги, моя подпрограмма не сможет найти ее по ABRecordID, поэтому, если я думаю, что поиск по хэшу имени, который я сохранил, не сможет найти дублирующееся имя вместо нового ABRecordID для этого конкретного запись, на которую я ранее ссылался?
В конце концов, какой ЛУЧШИЙ способ получить долгосрочную ссылку на запись адресной книги IOS? И если приведенный выше совет действительно работает, что мне не хватает?
4 ответа
Наиболее надежный (но не полностью отказоустойчивый) подход заключается в определении приоритета полей ABRecord и сохранении из этого списка столько, сколько доступно вместе с ABRecordID, в свой собственный (хешированный) частный формат записи. При извлечении личной записи (или в другое удобное время) вы можете проверить, что личная запись соответствует ABRecord, и выполнить серию резервных проверок, чтобы убедиться в ее точности.
Пример приоритета рейтинга:
- ABRecordID
- Имя
- Фамилия
- Номер телефона
- Почтовый Индекс
При извлечении записи вы можете сначала сопоставить ABRecordID
, Если это не дает результатов, вы можете сделать поиск FirstName + LastName
, Затем вы можете сопоставить эти результаты с PhoneNumber
... и т. д. Таким образом, вы можете различить 2 Боба Смита, поскольку у них могут быть разные телефонные номера (или у одного может не быть телефонного номера). Конечно, в зависимости от того, насколько длинен ваш список приоритетов, тем более надежным будет этот механизм.
Последнее средство будет побуждать пользователя различать 2 Боба Смита с совершенно новым ABRecordID
чьи записи в остальном идентичны - в конце концов, такая неудобная подсказка была бы гораздо более дружелюбной, чем разрешение пользователю связываться с неправильным Бобом Смитом (и, как я уже сказал, будет последним средством).
Однако это решение для AB может включать некоторые проблемы синхронизации.
Это знакомая проблема для всех, кто работал с iOS Media Player. конкретно MPMediaItems
в музыкальной библиотеке пользователя есть свойство MPMediaItemPropertyPersistentID
которые документы описывают как:
Не гарантируется, что значение будет сохраняться в течение цикла синхронизации / несинхронизации / синхронизации.
Другими словами, PersistentID
не гарантируется быть постоянным. Решения для этого включают выполнение аналогичных проверок на MediaItem
свойства.
RecordID изменяется только при удалении или сбросе, когда это будет сделано, все новые записи будут иметь также новые созданные Property и измененные свойства.
Когда я впервые читаю адресную книгу, я сохраню все записи записи вместе с RecordID в моей базе данных.
Я сохраню последний раз контакты, синхронизированные из контактов, в мою базу данных (назовите это как-то: lastSyncedTime) и сохраню где-нибудь.
Я закончил синхронизацию контактов в первый раз, теперь делаю следующее для синхронизации в любое время в будущем.
перебирая все записи,
проверьте createTime(kABPersonCreationDateProperty) против lastSyncedTime. Если createTime > lastSyncedTime, сохраните recordID в NSArray "newRecords".
Если!(Шаг 1), тогда проверьте свой измененный атрибут (kABPersonModificationDateProperty) против lastSyncedTime. Если ModifiedDate > lastSyncedTime, тогда сохраните recordID в NSArray "ifiedRecords".
if!(1) &&!(2) сохранить все recordID в "unModifiedRecords".
Теперь я буду читать все контакты из моей локальной базы данных,
Я удалю все записи локальной базы данных, которые не найдены ни в "ifiedRecords", ни в" unModifiedRecords".
Я обновлю все "ifiedRecords"в локальной базе данных.
Я создам новые записи для всех записей в "newRecords".
Обновите lastSyncedTime соответственно.
Ясно говорит вам, как справиться с этим.
Документация сообщает вам, что вы не можете рассчитывать на ABRecordID в качестве постоянного идентификатора.
Рассмотрим следующий сценарий: у пользователя есть запись для "Боба Смита". Затем пользователь удаляет свою запись "Боб Смит", а затем импортирует свои контакты со своего компьютера (создавая новый идентификатор) через синхронизацию iTunes.
Поэтому, если вы хотите сохранить постоянную ссылку на существующий контакт, вы можете сохранить ссылку на имя и идентификатор в качестве подсказки, что это та же самая запись, которую вы использовали ранее, но реальной постоянной ссылки не существует.
Если вы сохраняете постоянную ссылку на контакт в адресной книге, вы всегда должны быть готовы к тому, что это может быть не тот контакт, который вы использовали ранее.