4

我使用 NSPersistentCloudKitContainer 将核心数据与 Cloud Kit 同步。为了准备新的迁移,我创建了 xcdatamodel 的新模型版本并将其标记为“当前”。我创建了一个新实体并添加了来自另一个实体的关系。我认为没有什么特别适合轻量级迁移的。

让我们命名这个新实体:EntityNew

这是我初始化 NSPersistentCloudKitContainer 的代码:

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentCloudKitContainer(name: "MyContainerName")


    container.loadPersistentStores(completionHandler: { _, error in
        guard let error = error as NSError? else { return }
        fatalError("###\(#function): Failed to load persistent stores:\(error)")
    })

    container.viewContext.automaticallyMergesChangesFromParent = true

    return container
}()

shouldMigrateStoreAutomaticallyshouldInferMappingModelAutomatically默认设置为 true。

在当地一切正常。迁移过程中未发生错误。

当我创建EntityNew的新实例时,问题就开始了:

let newItem = EntityNew(context: context)   
newItem = "..."

saveContext()

newItem在本地创建没有任何问题,但 iCloud 同步从此刻停止工作。控制台中出现以下错误:

"<CKRecordID: 0x283fb1460; recordName=2E2209A1-F9F6-4DF2-960D-2C31F764ED05, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__>" = "<CKError 0x2830a5950: \"Batch Request Failed\" (22/2024); server message = \"Atomic failure\"; uuid = ADA626F4-160E-49FE-A0BD-2198E5FBD09A; container ID = \"iCloud.[MyContainerID]\">"

"<CKRecordID: 0x283fb1a00; recordName=3145C837-D80D-47E0-B944-DBC6576A9B0A, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__>" = "<CKError 0x2830a4000: \"Invalid Arguments\" (12/2006); server message = \"Cannot create or modify field 'CD_[Fieldname in EntityNew]' in record 'CD_[OtherEntityName]' in production schema\"; uuid = ADA626F4-160E-49FE-A0BD-2198E5FBD09A; container ID = \"iCloud.[ContainerID]\">";

“无法在生产模式中的记录 'CD_[OtherEntityName]' 中创建或修改字段 'CD_[Fieldname in EntityNew]'”

Cloud Kit 尝试修改记录 CD_[OtherEntityName] 上的字段 CD_[Fieldname in EntityNew](正确),这不是我上面创建的实体!所以 Core Data 试图修改错误的实体!并非所有字段都发生此行为(大约 10 个字段中的 5 个)。我检查了 iPhone 的本地 sqlite 文件,但本地表似乎是正确的。在开发和生产 icloud-container-environment 中都可以观察到这种现象。如果我从一个空数据库开始(它已经包含新实体,因此不需要迁移),则同步工作。

我错过了什么?有任何想法吗?谢谢!

4

0 回答 0