如何使用NSPersistentCloudKitContainer设置有序关系?

时间:2019-07-10 08:57:17

标签: swift core-data xcode11 nspersistentcloudkitcontainer

当我检查paypal.Buttons({ createSubscription: function (data, actions) { return actions.subscription.create({ 'plan_id': 'P-1G3183167U24246113LMNZLY' }); }, onApprove: function (data, actions) { alert('You have successfully created subscription ' + data.subscriptionID); } }).render('#paypal-button-container'); 时,出现了错误Used with CloudKit。关于有序关系有什么想法吗?

IDE:Xcode11 beta3

enter image description here

这里是Folder.children must not be ordered实体。

enter image description here

1 个答案:

答案 0 :(得分:5)

(适用于:从iOS 13开始,以及14的早期测试版)

云工具包不能使用有序关系(这会很糟糕,因为有序数据是存在的基本事物)。原因是,所有内容都由CKRecord(云工具包记录)支持,而不是实际的核心数据;这是一种完全不同的数据存储类型,PersistentCloudKitContainer正在将您的数据即时重写为CKRecords。 CKRecords没有一种机制可以像我们在Core Data有序关系中一样需要维护有序项目的日记。

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

所以...

您有一些不好的选择:

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

无论做什么,这都是不好的:

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

  2. 子对象的排序(这是我使用的):您必须在子对象的每个添加和删除操作中插入自己,并运行代码来调整所有子对象的orderIndex值。我通过具有CoreDataManager.createChild(atIndex :),CoreDataManager.deleteChild()和CoreDataManager.moveChild(toIndex :)函数来管理此问题,这些函数具有更新orderIndex值的副作用。但是至少您会得到“获取父对象;对于parent.children中的c,则...”,然后级联删除操作。但是:由于子项只有一个orderIndex值,因此子项只能在一个父项的列表中。

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