1

我有一个已经推送到生产的模型,我想将一个属性作为关系移动到一个新实体。

由此:

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 处理容器迁移的方式吗?

4

0 回答 0