我沿着苹果的文章进行了相关的商店更改,主要是重复数据删除。https://developer.apple.com/documentation/coredata/consuming_relevant_store_changes
我还下载了Core Data / CloudKit演示应用程序,该应用程序已经具有重复数据删除过程。https://developer.apple.com/documentation/coredata/synchronizing_a_local_store_to_the_cloud
在Demo项目中,我观察到更多的时候,帖子与标签的关系会松动。经过一些调查后,我假设当与帖子有关系的标签在重复数据删除过程中被删除时,在相关帖子同步到设备之前,会发生这种情况。
当帖子现在到达设备时,其相关的标签对象不再存在。因此,也不可能找到应该连接到Post的保留的、已消除重复的标记对象。
我想知道为什么在演示项目中以这种方式实现,因为这确实会导致关键数据丢失。
我也不知道如何避免它。在文章中,Apple建议使用Core Datas tombstone来保留已删除对象的某些值。然而,没有进一步的解释。
它也没有在Demo项目中实现。
我如何恢复失去的关系,墓碑如何帮助它?
示例:
在同步之前:
同步后:
2条答案
按热度按时间vd8tlhqk1#
我和苹果开发者技术支持一起调查了这个问题,结果发现目前只有一个解决方案。
当对象在重复数据消除过程中被删除时,在其相关对象同步到设备之前,就会出现此问题。当后来相关对象最终到达时,关系已经无效。
目前,唯一的解决方案是将对象标记为已删除,而不是在重复数据消除期间实际删除它们。在我的例子中,我创建了一个名为“Dedup”的实体,并带有Date属性。
我没有删除对象,而是将其链接到新的重复数据消除对象并保存重复数据消除的日期。经过一段较长的时间(几个月),当我确定所有关系都建立起来时,我最终删除了这些对象。
目前Core Datas tombstone只能存储属性,不能存储关系。我建议苹果扩展功能,以存储删除时相关的对象的对象ID。
案例:FB10995925
gj3fmq9x2#
在iCloud用户之间共享核心数据对象的示例项目中,Apple现在涵盖了这种情况。他们添加了一些代码来处理重复对象的软删除。为此,他们在
Tag
实体上添加了一个deduplicatedDate
属性,然后在一段时间后才删除对象。参见文件PersistenceController+Deduplicate.swift
。他们还必须从UI中过滤这些标记为重复数据消除的对象(如TaggingView.swift
中)。