CKReference .DeleteSelf 属性无效

Posted

技术标签:

【中文标题】CKReference .DeleteSelf 属性无效【英文标题】:CKReference .DeleteSelf attribute has no effect 【发布时间】:2015-09-25 19:02:22 【问题描述】:

.DeleteSelf 究竟是如何工作的?文档说:

当参考对象的动作设置为 CKReferenceActionDeleteSelf,引用的目标——即 存储在引用的 recordID 属性中的记录——成为所有者 的源记录。删除目标(所有者)记录会删除所有 其来源记录。

但我的印象是删除目标并不总是删除源。当它保留在容器中时,客户端下载它,并期望引用指向某个地方,但是在客户端上构建服务器数据存储的切片时目标不存在,这很烦人?

您如何处理这种情况?你忽略了那种记录?还是定期查找 CloudKit 存储,搜索损坏的记录以删除它们?

或者,与其删除一条记录,不如设置一个属性使其处于已删除状态,但将其保留在数据库中?

【问题讨论】:

您应该能够依赖 .DeleteSelf。如果它不起作用,那么您应该在bugreport.apple.com 创建一个错误报告最好同时手动删除所有相关记录。 我还看到 .DeleteSelf 出现间歇性行为 我遇到了这个问题。我有几个与主表具有一对多关系的表。在公共数据库中,我添加主记录,然后在其他表中添加一些记录。如果这一切都是由一个用户完成的,并且没有其他用户访问数据,那么删除主记录会导致所有其他记录按预期删除。但是一旦另一个用户访问了数据,那么级联删除就不会发生,只会删除主记录。如果你不能指望这个功能,这似乎毫无意义。 【参考方案1】:

我只是在这个问题上挣扎了一段时间,我想我会分享我的发现......

这基本上是一个权限问题。仅当删除记录的用户对所有需要删除的记录具有“写入”权限时,级联删除才会起作用。 因此,在 CloudKit Dashboard 中,级联删除仅适用于使用开发者的 iCloud 帐户创建的记录。

如果您需要删除不属于删除它们的用户的记录,您可以在安全下为记录类型添加“写入”权限。

【讨论】:

我的记录在同一个用户创建的同一个区域中,引用仍然没有被删除。我认为这是 CloudKit 仪表板中的一个错误。是的,它在 2017 年末仍在发生。:)【参考方案2】:

如果您通过 CloudKit Dashboard 删除,则必须等待切换记录类型以检查引用的另一端。您很可能在删除实际发生之前切换了。您可以使用网络选项卡上的 Safari 网络检查器来检查删除实际完成的时间。删除多条记录需要很长时间。

【讨论】:

以上是关于CKReference .DeleteSelf 属性无效的主要内容,如果未能解决你的问题,请参考以下文章

如何从 CKReference 对象中获取引用字符串

设置 CKReference 未保存

CloudKit CKReference 列表

使用 CKQueryOperation 和 CKReference 获取大集合

CloudKit - 在 CKRecord 中存储多个 CKReference

从 CloudKit 获取包括 CKReference 的数据