Использование Core Data, iCloud и CloudKit для синхронизации и резервного копирования, а также их совместная работа

111

Я нахожусь на ранней стадии создания приложения, в котором я хотел бы сохранять, синхронизировать и создавать резервные копии данных. Приложение не будет хранить файлы, только данные в базе данных. Это будет iOS 8 и выше, поэтому я могу использовать CloudKit. Я провел небольшое исследование и до сих пор не понимаю, как Core Data, iCloud и CloudKit работают вместе.

Насколько я понимаю, CloudKit - это всего лишь способ получения и извлечения данных в / из облака. CloudKit - это просто другой способ синхронизации данных с iCloud?

Мои вопросы:

  1. Если я использую CloudKit, нужно ли мне создавать локальную базу данных ядра?

    • Если да, будет ли он автоматически синхронизирован с iCloud или мне придется вызывать методы для хранения в обоих местах?
  2. Если данные хранятся только в облаке, пользователь сможет получить к ним доступ, когда устройство iOS не подключено к Интернету. Я читал, что CloudKit будет иметь только ограниченное кеширование.

  3. Как это будет работать, если учетная запись iCloud не включена.

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

Мое текущее понимание:

  • Core Data используется для локального хранения данных

  • iCloud синхронизирует данные и сохраняет в облаке

  • CloudKit дает возможность хранить и управлять данными в облаке ??

Надеюсь, я предоставил достаточно информации, чтобы этот вопрос не закрылся.

Ян
источник
2
Даже я не проводил так много исследований по этому поводу, но насколько я понял, его нельзя хранить в местных магазинах. Это что-то вроде обычной клиентской службы сервера. Вот почему без Интернета вы не можете получить доступ к своей БД. и согласно Документу, если пользователь не включил учетную запись icloud в то время, вы можете читать данные только из общедоступного контейнера
Сачин,
@Yan, можем ли мы сделать это, пожалуйста, предложите, stackoverflow.com/questions/25600556/…
Nikunj 01

Ответы:

183

Это вот так:

  • Core Data сам по себе является полностью локальным и не работает автоматически с какими-либо облачными сервисами Apple.
  • Core Data с включенным iCloud включает синхронизацию через iCloud. Любые изменения, которые вы сохраняете в Core Data, распространяются в облако, и любые изменения, внесенные в облако, автоматически загружаются. Данные хранятся как в iCloud, так и в локальном файле постоянного хранилища, поэтому они доступны, даже когда устройство отключено. Вам не нужно писать какой-либо специфический для облака код, вам просто нужно добавить прослушивание входящих изменений (что очень похоже на изменения, сделанные в другом контексте управляемого объекта).
  • CloudKit не имеет отношения к Core Data. Это не система синхронизации, это система передачи. Это означает, что каждый раз, когда вы хотите читать / писать облачные данные, вам необходимо сделать явные вызовы API CloudKit для этого. Ничего не происходит автоматически. CloudKit не хранит данные на устройстве, поэтому данные недоступны, если устройство отключено. CloudKit также добавляет некоторые функции, недоступные для Core Data с iCloud, например общедоступные общие данные и возможность загружать только часть набора данных, а не целиком.

Если вы хотите использовать CloudKit с Core Data, вам придется написать собственный код для перевода между управляемыми объектами и записями CloudKit. Это не невозможно, но нужно написать больше кода. Это может быть более надежным , но это слишком рано , чтобы сказать наверняка.

Я написал сообщение в блоге, в котором описал CloudKit с точки зрения человека, который в прошлом использовал Core Data и iCloud.

Обновление , июнь 2016 г .: В последней документацииNSPersistentStoreCoordinator все, что связано с Core Data с iCloud, помечено как устаревшее. В результате этого, вероятно, следует избегать для новых разработок.

Том Харрингтон
источник
1
Раньше у меня были проблемы с повреждением при использовании Core Data с iCloud, но я не использовал его много с момента выхода iOS 7. Это должно быть намного лучше. С CloudKit еще рано говорить, поскольку он еще официально не выпущен.
Tom Harrington
3
@Tom Harrington - Не могли бы вы попробовать Core Data с iCloud для iOS 8 и поделиться своим впечатлением? Я тоже столкнулся с множеством повреждений в iOS 7, и служба поддержки Apple подтвердила множество ошибок. Я надеюсь, что iOS 8 доведет свою надежность до приемлемого уровня, но был бы
рад
1
Проверьте CKSIncrementalStore. github.com/CloudKitSpace/CKSIncrementalStore
Нофель Махмуд
3
«Вам не нужно писать какой-либо облачный код, вам просто нужно добавить прослушивание входящих изменений (что очень похоже на изменения, сделанные в другом контексте управляемого объекта)». - есть ли у вас образец кода / пример по этому комментарию? Я не могу найти убедительных примеров :(
Эрнест
1
@TomHarrington с такой обратной связью, зачем вообще есть stackoverflow, если все, что нам нужно сделать, это проверить документацию :(
Эрнест
15

В iOS 13 Apple анонсировала новые функции в Core Data для лучшей работы с CloudKit. Главное дополнение - это NSPersistentCloudKitContainer, который в основном управляет синхронизацией между Core Data и CloudKit за вас.

Вы можете узнать больше в сеансе WWDC Использование основных данных с CloudKit .

Apple также выпустила отличную коллекцию документов для этого самого использования: зеркалирование хранилища основных данных с помощью CloudKit .

Pomme2Poule
источник