Как обновить пользователей до нового контейнера CloudKit при использовании NSPersistentCloudKitContainer?

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

Из этого:

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

К этому:

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

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

Согласно документации Apple в разделе "Обновите рабочую схему", мне нужно будет перейти на новый контейнер CloudKit, поскольку мы не можем удалять атрибуты в "производственных" записях 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?

0 ответов