我使用CoreData + NSPersistentCloudKitContainer备份我的模型。我的一个NSManagedObject将图片存储为二进制数据,并允许对外部存储进行检查。
这是非常随机的,但有时当我调用context.save()
时,即使没有编辑这个对象,也会出现合并冲突。实际上,我只是尝试创建一个新的对象(与有冲突的对象不同的类型),而崩溃发生在另一个对象上。
除了External Data Reference
的自引用外,每一项都是相同的值。
ERROR AppDelegate.saveContext():262 - Unresolved error Error Domain=NSCocoaErrorDomain Code=133020 "Impossible de fusionner les changements." UserInfo={conflictList=(
"NSMergeConflict (0x600002c62f40) for NSManagedObject (0x60000158da40) with objectID '0x816659a4c358c32f <x-coredata://CEAE3B14-5782-4C18-AAE8-B05D91CFEC8A/Aquarium/p5>' with oldVersion = 56 and newVersion = 57 and old object snapshot = {\n albums = \"<null>\";\n aquaID = 6;\n dateDeCreation = \"2022-01-15 18:24:00 +0000\";\n imageData = External Data Reference: <self = 0x60000158db80 ; path = 1B9355A6-4101-479D-81F1-DFC106BBCD75 ; length = 1617016>;\n nom = 11321;\n volume = 60;\n} and new cached row = {\n albums = \"<null>\";\n aquaID = 6;\n dateDeCreation = \"2022-01-15 18:24:00 +0000\";\n imageData = External Data Reference: <self = 0x6000015ccf50 ; path = 1B9355A6-4101-479D-81F1-DFC106BBCD75 ; length = 1617016>;\n nom = 11321;\n volume = 60;\n}"
), NSExceptionOmitCallstacks=true}, ["NSExceptionOmitCallstacks": 1, "conflictList": <__NSArrayM 0x600003a25ec0>(
NSMergeConflict (0x600002c62f40) for NSManagedObject (0x60000158da40) with objectID '0x816659a4c358c32f <x-coredata://CEAE3B14-5782-4C18-AAE8-B05D91CFEC8A/Aquarium/p5>' with oldVersion = 56 and newVersion = 57 and old object snapshot = {
albums = "<null>";
aquaID = 6;
dateDeCreation = "2022-01-15 18:24:00 +0000";
imageData = External Data Reference: <self = 0x60000158db80 ; path = 1B9355A6-4101-479D-81F1-DFC106BBCD75 ; length = 1617016>;
nom = 11321;
volume = 60;
} and new cached row = {
albums = "<null>";
aquaID = 6;
dateDeCreation = "2022-01-15 18:24:00 +0000";
imageData = External Data Reference: <self = 0x6000015ccf50 ; path = 1B9355A6-4101-479D-81F1-DFC106BBCD75 ; length = 1617016>;
nom = 11321;
volume = 60;
}
我怀疑数据引用在应用程序加载和第一次调用备份之间发生了变化。但是长度是相同的,因为这个值在用户端没有改变,所以我不明白为什么引用会改变。
我现在没有使用合并策略,它只是不保存。
为了安全起见,我是否可以使用NSMergeByPropertyObjectTrumpMergePolicy,或者是否应该找到为什么引用发生了更改?
发布于 2022-03-04 15:07:20
我从未使用过CoreData外部数据引用,所以这是一个疯狂的猜测。
在我看来,合并冲突的产生是因为对外部文件的引用发生了变化,尽管文件的路径保持不变。
这可能是自定义合并策略的一种情况。您必须通过自己的代码解决合并冲突,该代码只需选择一个引用,因为这两个引用反正都指向同一个文件。
最近我尝试为不同的情况建立我自己的自定义合并策略,但是我不能完全确定我是否正确,请看我的问题,相关的代码和参考这里。也许您可以针对自己的情况测试类似的代码。
编辑
关于您的问题,如果您可以使用NSMergeByPropertyObjectTrumpMergePolicy
:根据合并冲突,除了imageData
引用之外,您实体的所有属性都保持不变。因此,在尝试使用自定义合并策略之前,应该明确地尝试标准合并策略:
NSMergeByPropertyObjectTrumpMergePolicy
只从托管上下文更新imageData
引用,而NSMergeByPropertyStoreTrumpMergePolicy
只从持久存储更新imageData
引用。但是,由于所有其他属性都没有改变,而且两个实体中的文件路径都是相同的,所以您可以同样地尝试NSOverwriteMergePolicy
和NSRollbackMergePolicy
,它们分别在托管上下文或持久存储中使用整个实体,请参见医生们。只有在由于外部引用而失败的情况下,才应该考虑自定义合并策略。
https://stackoverflow.com/questions/71313747
复制