Записать уникальность при использовании NSPersistentCloudKitContainer? - PullRequest
0 голосов
/ 24 января 2020

Я успешно перенес свое приложение на использование NSPersistentCloudKitContainer, чтобы синхронизировать его данные с помощью CloudKit.

Однако мне интересно, как мне поступить с уникальностью определенных объектов. Например, предположим, что объект User имеет свойство emailAddress, которое должно быть уникальным. Теперь рассмотрим случай, когда два устройства создают User экземпляров с одним и тем же адресом электронной почты. В моей текущей реализации ничто не навязывает уникальность, поэтому я получаю 2 экземпляра, доступных на обоих устройствах, как только они получат синхронизацию изменений.

В настоящее время всякий раз, когда я выбираю объекты, предполагая, что они уникальны, я проверяю, они действительно есть, и если нет, объедините их, включая присвоение отношений одного из экземпляров другому. После слияния удаляю "пустой" экземпляр. Хотя это, кажется, работает нормально, я также могу предположить случаи, когда это может go неправильно: когда два устройства объединяются в одно и то же время и удаляют разные экземпляры, вызывая удаление всех из них.

Как следует Я имею дело с такими случаями?

PS. Я искал похожие вопросы и нашел несколько похожих, но все они относятся к явному использованию CKRecord. Поскольку я использую NSPersistentCloudKitContainer, который инкапсулирует и упрощает реализации CloudKit, я не работаю с такими классами «низкого уровня».

1 Ответ

1 голос
/ 03 февраля 2020

Базовые данные имеет ограничения уникальности, которые могут быть установлены для одного поля или для нескольких полей. Не забудьте установить mergePolicy, чтобы Core Data знала, как вы хотите, чтобы он обрабатывал конфликты при сохранении. Вот более ранняя статья стека, в которой говорится об этом.

Как добавить уникальные ограничения для некоторых полей в Базовых данных

CloudKit не имеет логики бэкэнда c для этого это в основном хранилище ключей / значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...