我有一个已经推送到生产的模型,我想将一个属性作为关系移动到一个新实体。
由此:
extension Note {
@NSManaged public var drawingData: Data?
....
}
对此:
extension Note {
@NSManaged public var drawing: Drawing?
....
}
extension Drawing {
@NSManaged public var drawingData: Data?
....
}
根据“更新您的生产模式”部分下的Apple Docs,我需要迁移到新的 CloudKit 容器,因为我们无法删除“生产”CKRecords 上的属性。
将用户迁移到一个全新的商店,使用 NSPersistentCloudKitContainerOptions 将新商店与新容器相关联。
我已经阅读了所有文档,以及我在 NSPersistentCloudKitContainer 上找到的每个博客,但没有一个真正涉及如何处理这个问题。
建议的解决方案
我需要为 2 个不同的容器(“旧”和“新”)提供 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 处理容器迁移的方式吗?