【问题标题】:CloudKit fails to sync with CoreData with ConstraintsCloudKit 无法与带有约束的 CoreData 同步
【发布时间】:2020-11-06 00:14:27
【问题描述】:

我有一个带有约束的数据模型,以确保属性是唯一的。

当我重新安装应用程序(数据在云中可用)时,同步失败并出现以下错误:

2020-07-16 10:33:13.401904+0200 Structured[40519:1639423] [error] error: CoreData+CloudKit: -[PFCloudKitImporterZoneChangedWorkItem applyAccumulatedChanges:error:]_block_invoke_2(440): Failed to save applied changes from import: Error Domain=NSCocoaErrorDomain Code=133021 "(null)" UserInfo={NSExceptionOmitCallstacks=true, conflictList=(
    "NSConstraintConflict (0x600000ab0600) for constraint (\n    day,\n    month,\n    year\n): database: 0xba46bc9a935a60ef <x-coredata://8AB04C93-B9EB-413F-BD0C-9EF854D89D20/Day/p1>, conflictedObjects: (\n    \"0xba46bc9a934e60ef <x-coredata://8AB04C93-B9EB-413F-BD0C-9EF854D89D20/Day/p4>\"\n)"
)}

此错误会再次出现几次,并且远程数据永远不会与本地可用数据同步和合并。

我正在以通常的方式初始化持久性容器:

    lazy var persistentContainer: NSPersistentCloudKitContainer = {
        let container = NSPersistentCloudKitContainer(name: "Today")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        container.viewContext.automaticallyMergesChangesFromParent = true
        container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        return container
    }()

我发现了一个类似的issue,但没有得到答复。

【问题讨论】:

  • 我的情况完全一样。你找到解决办法了吗?更改 mergePolicy 没有帮助。
  • Apple 工程师在该主题中回答说 NSPersistentCloudKitContainer 不支持唯一约束。因此,除了消除约束并自行解决之外,没有机会修复它。我只是不确定如何通过不使 thicgs 过于复杂(例如添加时间戳属性等)来更好地跟踪要保留的对象

标签: ios swift core-data icloud cloudkit


【解决方案1】:

您不能在 NSPersistentCloudKitContainer 中使用唯一约束,请阅读 here

如果您有开发人员错误导致的冲突,并且如果您有重复记录,您可以使用您自己的自定义 UUID 字段应用某种形式的重复数据删除。

【讨论】:

  • 谢谢!我最终实现了自己的重复数据删除。不理想,但没有其他工作。
猜你喜欢
  • 2016-06-11
  • 2021-05-23
  • 2021-05-27
  • 2021-11-10
  • 1970-01-01
  • 2012-12-28
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多