当我检查时Used with CloudKit
, 错误Folder.children must not be ordered
出现了。关于有序关系有什么想法吗?
使用 Xcode 11(测试版 3)。
![enter image description here](https://i.stack.imgur.com/1OOkS.png)
这是Folder
Entity:
![enter image description here](https://i.stack.imgur.com/wYqut.png)
适用于 iOS 13 和 iOS 14 的早期测试版。
云套件无法使用有序关系(这只会失败,因为有序数据是存在的基本事物)。原因是一切都有支持CKRecord
(云套件记录)不是真正的核心数据——它是一种完全不同类型的数据存储,并且PersistentCloudKitContainer
正在将数据即时重写到 CKRecords 并返回。CKRecord
我们没有按照我们在核心数据有序关系中所需的方式维护有序项目日记的机制。
这意味着它不太可能很快被“修复”,因为它通常需要对 CloudKit 和苹果的 iCloud 进行更改(而不是仅对 CoreData 进行更改)。
So...
你有一些不好的选择:
- 没有正式的关系——而是有一个存储字段,例如参考列表。当您添加/删除子对象时,请自行维护此内容。本质上,父记录中有一个“管理”字段,您可以用它来维护自己的关系机制。 (例如:生成一个
UUID
对于每个孩子,父母为所有孩子存储 UUID 的串联列表)
- 使用 CoreData 关系,并将排序数据存储在子对象中,例如
orderIndex int
您手动维护的字段。
- 混合:使用从父母到孩子的无序关系,并且also在父级中存储“子级顺序”字段。 CoreData 管理关系,您可以根据需要手动维护和应用这些子项的顺序。
无论你做什么,都是不好的:
-
没有关系:没有“获取父级”并通过关系获取对子级的引用;你必须分别获取两者。也没有为您完成“删除”规则,例如“在删除父级时,级联删除子级。”当您需要多个集合中的子项时,这会起作用(因为每个集合记录都保留其自己的子项列表)
-
子对象中的排序(这就是我使用的):您必须将自己插入到子对象的每个添加和删除操作中,运行代码来调整所有子对象的 orderIndex 值。我通过拥有一个来管理这个CoreDataManager.createChild(atIndex:)
, CoreDataManager.deleteChild()
and CoreDataManager.moveChild(toIndex:)
应用更新 orderIndex 值的副作用的函数。但至少你得到“获取父级;for c inparent.children do...”并且级联删除回来了。然而:现在子项只能出现在一个父项列表中,因为子项只有一个 orderIndex 值。
-
关系+父级中手动维护的排序字段:让核心数据管理关联,当您需要有序的子级时,您可以使用parent.orderedChildren()
读取你的函数.childOrder
父字段,将其应用于 .children 列表。但是...你还是要管理父母的.childOrder
手动字段,并在每次添加/删除/重新排序子项时更改它。然而,使用云同步时,您的系统存在许多潜在的错误.child
列出和.childOrder
当在不同的应用程序实例中添加/删除子项时,字段值会不同步。将子列表和排序分开意味着它们可以通过云同步单独更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)