CloudKit: 一次查询中获取记录和引用(类似于Parse)

4
随着Parse的即将终止,我正在使用CloudKit重新编写应用程序。假设我正在制作一个食谱安排应用程序。我想要一个给定的时间表包含有序的菜谱列表,并且菜谱可以在多个时间表中。所以我有:
  • 一个Schedule对象,它与名为“scheduleItems”的ScheduleItem对象具有一对多的关系
  • ScheduleItem对象具有dayOfWeek字段和与名为“recipe”的Recipe对象的一对一关系
  • Recipe对象具有一些信息,包括其名称和成分(更多关系)
假设我有Schedule对象,并且我想在一个查询中获取所有的ScheduleItems及其关联的Recipes。在Parse中,我可以设置这个查询:
PFQuery *query = [PFQuery queryWithClassName:@"Schedule"];
[query includeKey:@"scheduleItems.recipe"];

查询语句将获取所有的scheduleItems和它们的recipes,使我避免了执行多个网络请求的烦恼。

在CloudKit中是否有方法可以做到这一点?我看到可以使用CKFetchRecordsOperation根据记录ID一次性获取多个记录,但我不知道recipes的记录ID,直到我已经获取了scheduleItems,因此仍需要进行第二个网络请求。

2个回答

3

CloudKit不是关系型数据库,而是一个键值存储。它没有在一个查询中查询多个recordType的功能,也没有聚合查询的功能。在您的情况下,由于它是一对一的关系,您可以通过在Recipe中添加CKReference到Schedule来将其限制为2个查询。因此,如果您有一个时间表,您可以进行一次查询以获取所有相关的ScheduleItem,并进行另一次查询以获取所有相关的Recipe。


谢谢回答,这真是个让人失望的消息。您指的是哪种一对一关系?实际上,在我的情况下,食谱可以与多个日程安排相关联(因此间接地与多个日程相关),但使用参考列表和CKQuery,您的想法仍然可行,对吗? - UberJason
你提到了这个:一个 ScheduleItem 对象有一个 dayOfWeek 字段,并且与一个名为“recipe”的 Recipe 对象具有一对一关系。 - Edwin Vermeer
如果ScheduleItem和Recipe都可以有一个指向Schedule的CKReference,那么你可以同时触发这两个查询。你提出的解决方案也是可行的,先查询ScheduleItem,然后使用所有id查询Recipe。哪种情况最适合您取决于这些记录类型的其他要求。 - Edwin Vermeer
啊,抱歉 - ScheduleItem一对一地对应一个Recipe,但是反向关系(概念上)可能是一对多的。但归根结底应该是一样的,我理解你的解决方案。谢谢! - UberJason

2
在即将发布的版本('16)中,有一种方法可以定义父级关系,然后获取父记录将导致子记录也被获取。这在WWDC会议“CloudKit的新功能”(2016年)中有介绍:https://developer.apple.com/videos/play/wwdc2016/226/ 更正一下,'16引入的父引用并不是为了实现单次获取,而是在使用API的新共享部分时自动共享所有后代。因此答案是否定的,但在共享记录时,它会稍微减轻负担。

1
谢谢回复 - 我记得看过那个会议,当他们提到“父级关系”时也感到兴奋,但后来又感到失望,因为它不是我想要的。 :) - UberJason
1
我本来想删除我的回答,因为它有点不是回答,但 Edwin 的回答也是如此。最终像这样的线程:https://dev59.com/jIHba4cB1Zd3GeqPTJa5 说出了真相:你应该将其仅用作消息层,但即使消息有时也具有图形。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接