CloudKit:在一个查询中获取记录和引用(如在Parse中)

时间:2016-02-01 22:55:06

标签: ios parse-platform cloudkit

随着Parse即将死亡,我正在使用CloudKit重写应用程序。假设我正在制作食谱调度应用程序。我希望给定的时间表包含有序的食谱列表,并且食谱可以有多个时间表。所以我有:

  • 一个Schedule对象,它与ScheduleItem对象有一对多关系,称为" scheduleItems"
  • 一个ScheduleItem对象有一个dayOfWeek字段和一个名为" recipe"
  • 的Recipe对象的一对一关系
  • 食谱对象包含一些信息,包括其名称和成分(更多关系)

假设我有Schedule对象,并且我希望在一个查询中获取其所有ScheduleItem及其相关的Recipes。在Parse中,我可以设置此查询:

PFQuery *query = [PFQuery queryWithClassName:@"Schedule"];
[query includeKey:@"scheduleItems.recipe"];

该查询将获取所有scheduleItem及其所有配方,从而避免执行多个网络请求。

有没有办法在CloudKit中执行此操作?我看到我可以使用CKFetchRecordsOperation一次获取多条记录给出其记录ID,但在我已经获取scheduleItem之前我不会知道食谱的记录ID,因此仍然需要第二个网络请求。

2 个答案:

答案 0 :(得分:3)

CloudKit不是关系数据库。它是一个键值商店。在一个查询中没有查询多个recordType的功能。聚合查询也没有功能。在您的情况下,因为它是一对一的关系,您可以通过在您的食谱中将CKReference添加到计划中将其限制为2个查询。那么,如果你有一个时间表,你可以做一个查询来获取所有相关的ScheduleItem和另一个查询以获得所有相关的食谱

答案 1 :(得分:1)

即将推出的版本中有一种方法(' 16):您可以定义父关系,然后获取父记录也会导致子项被提取。 WWDC会议中涵盖了这一点,以及CloudKit中的新功能' (2016):https://developer.apple.com/videos/play/wwdc2016/226/

更正,在' 16中引入的父引用不是为了能够进行单次提取,而是在使用API​​的新共享部分时自动共享所有后代。所以答案是肯定没有办法,但是在共享记录时,它的繁琐程度要小一些。