【问题标题】:How to set an ordered relationship with NSPersistentCloudKitContainer?如何设置与 NSPersistentCloudKitContainer 的有序关系?
【发布时间】:2023-04-04 07:58:01
【问题描述】:

当我检查Used with CloudKit时,出现了错误Folder.children must not be ordered。关于有序关系的任何想法?

IDE:Xcode11 beta3

这是Folder 实体。

【问题讨论】:

  • 你有想过这个吗?
  • @rs7 有序关系似乎是不可能的。
  • 是的,CloudKit 不支持有序关系。我目前正在尝试索引我的一些实体。手动管理索引并不好玩。
  • @hstdt 你用了什么方法?我目前正在考虑将 uuid 列表甚至整个子项直接存储为 Transformable/json。

标签: swift core-data xcode11 nspersistentcloudkitcontainer


【解决方案1】:

(适用于:iOS 13 和 14 的早期测试版)

云套件不能使用有序关系(这只是吹,因为有序数据是存在的基本事物)。原因是一切都以 CKRecord(云套件记录)而不是实际的核心数据内容为后盾——它是一种完全不同类型的数据存储,并且 PersistentCloudKitContainer 正在将您的数据动态重写到 CKRecords 并返回。 CKRecords 没有像我们在 Core Data 有序关系中需要的那样维护有序项目日志的机制。

这意味着它不太可能很快被“修复”,因为它通常需要对 CloudKit 和苹果的 iCloud 进行更改(而只是对 CoreData 进行更改)。

所以...

你有几个不好的选择:

  1. 没有正式的关系 - 而是有一个用于存储的字段,例如参考列表。在添加/删除子对象时自己维护它。本质上,在父记录中有一个“管理员”字段,用于维护自己的关系机制。 (例如:为每个孩子生成一个 UUID,父母为所有孩子存储一个串联的 UUID 列表)
  2. 使用 CoreData 关系,并将排序数据存储在子对象中,例如您手动维护的 orderIndex int 字段。
  3. 混合:使用从父到子的无序关系,并且在父中存储“子顺序”字段。 CoreData 管理关系,您可以根据需要手动维护和应用这些子级的排序。

不管你做什么,都是不好的:

  1. 没有关系:没有“获取父级”并通过关系获取对子级的引用;您必须分别获取两者。也没有为您完成“删除”规则,例如“删除父级,级联删除子级。”当您需要多个集合中的孩子时,这很有效(因为每个集合记录都有自己的孩子列表)

  2. 子对象中的排序(这是我使用的):您必须在子对象的每个添加和删除操作中插入自己,运行代码来调整所有子对象的 orderIndex 值。我通过 CoreDataManager.createChild(atIndex:)、CoreDataManager.deleteChild() 和 CoreDataManager.moveChild(toIndex:) 函数来管理这个,这些函数应用更新 orderIndex 值的副作用。但至少你得到“获取父级;对于父级.children 中的 c 做...”并且级联删除回来了。但是:现在孩子只能在一个父母的列表中,因为孩子只有一个 orderIndex 值。

  3. 关系+手动维护的父排序字段:让核心数据管理关联,当您需要排序的孩子时,您可以使用 parent.orderedChildren() 函数读取父级的 .childOrder 字段,将其应用于 .children 列表.但是...您仍然必须手动管理父级的 .childOrder 字段,并在每次添加/删除/重新排序子级时更改它。但是,使用 Cloud Sync,您的 .child 列表和 .childOrder 字段值会随着子项在不同应用程序实例中的添加/删除而不同步,因此存在许多潜在错误。保持子列表和排序分开意味着它们可以通过云同步单独更新。

【讨论】:

    猜你喜欢
    • 2019-12-19
    • 2020-05-09
    • 1970-01-01
    • 2017-06-25
    • 2023-03-26
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多