CloudKit与带有约束条件的CoreData同步失败

4

我有一个数据模型,其中有一个限制条件来确保属性的唯一性。

当我重新安装应用程序(云端有可用数据)时,同步失败并显示以下错误:

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
    }()

我发现了一个类似的问题,但没有得到解答。


我有完全相同的情况。你找到解决方案了吗?更改mergePolicy没有帮助。 - bodich
苹果工程师在该主题中回答说,NSPersistentCloudKitContainer不支持唯一约束。因此,除了删除约束并自行解决之外,没有修复的机会。我只是不确定如何更好地跟踪要保留哪个对象,而不使事情过于复杂(例如添加时间戳属性等)。 - bodich
1个回答

7

使用NSPersistentCloudKitContainer时无法使用唯一约束,详见此处

如果出现冲突,则是开发人员错误,如果出现重复记录,则可以使用自定义UUID字段应用某种形式的去重。


谢谢!最终我自己实现了去重。虽然不是最理想的方法,但其他方法都无法奏效。 - leoMehlig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接