Как обновить пользователей до нового контейнера 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?