Как обновить пользователей до нового контейнера CloudKit при использовании NSPersistentCloudKitContainer? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть модель, которая уже была передана в производство, и я хотел бы переместить атрибут в новую сущность в виде отношения.

Из этого:

extension Note {
   @NSManaged public var drawingData: Data?
   ....
}

В Это:

extension Note {
    @NSManaged public var drawing: Drawing?
    ....
}

extension Drawing {
   @NSManaged public var drawingData: Data?
   ....
}

В соответствии с Apple Docs в разделе «Обновление вашей производственной схемы» , мне нужно будет перейти на новый контейнер CloudKit, так как мы не можем удалить атрибуты на "production" CKRecords.

Перенесите пользователей в совершенно новое хранилище, используя NSPersistentCloudKitContainerOptions, чтобы связать новое хранилище с новым контейнером.

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

Предлагаемое решение

Мне нужно иметь 2 переменные для двух разных контейнеров, «старого» и «нового».

lazy var oldPersistentContainer: NSPersistentCloudKitContainer = {
   let container = NSPersistentCloudKitContainer(name: "Model")
   let storeLocation = URL(fileURLWithPath: "/path/to/cloud.store")
   let storeDescription =
        NSPersistentStoreDescription(url: storeLocation)
   // Set the container options on the cloud store
   cloudStoreDescription.cloudKitContainerOptions = 
        NSPersistentCloudKitContainerOptions(
        containerIdentifier: "com.myCompany.myApp")
   container.loadPersistentStores...
   ...
}()

/// NOTE: - `containerIdentifier` has been "bumped"
lazy var newPersistentContainer: NSPersistentCloudKitContainer = {
   let container = NSPersistentCloudKitContainer(name: "Model")
   let storeLocation = URL(fileURLWithPath: "/path/to/cloud.store")
   let storeDescription =
        NSPersistentStoreDescription(url: storeLocation)
   // Set the container options on the cloud store
   cloudStoreDescription.cloudKitContainerOptions = 
        NSPersistentCloudKitContainerOptions(
        containerIdentifier: "com.myCompany.myApp2")

   // TODO: Migrate Core Data Store if needed
   container.loadPersistentStores...
   ...
}()

ПРИМЕЧАНИЕ: newPersistentContainer будет иметь «выпуклый» containerIdentifier, а также будет выполнять перенос основных данных.

Тогда я думаю, что мне нужно будет вручную переместить все записи из oldPersistentContainer и добавить их в newPersistentContainer. Как только все данные были перемещены в новый контейнер, я удалил бы все записи из oldPersistentContainer. Будет ли этого достаточно с точки зрения очистки oldPersistentContainer?

Мне потребовалось некоторое время, чтобы придумать этот рабочий процесс, и я не уверен, что это «правильный» способ справиться с этим. Вот как мы должны обрабатывать миграцию контейнеров с помощью NSPersistentCloudKitContainer?

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