CloudKit:在一个查询中获取记录和引用(就像在 Parse 中一样)
CloudKit: fetch record and references in one query (like in Parse)
随着 Parse 即将消亡,我正在使用 CloudKit 重写一个应用程序。假设我正在制作一个食谱计划应用程序。我想要一个给定的时间表包含一个有序的食谱列表,并且食谱可以在多个时间表中。所以我有:
- 一个 Schedule 对象,它与名为 "scheduleItems"
的 ScheduleItem 对象具有一对多关系
- ScheduleItem 对象有一个 dayOfWeek 字段,并且与名为 "recipe"
的 Recipe 对象存在一对一关系
- 一个 Recipe 对象有一些信息,包括它的名称和成分(更多关系)
假设我有 Schedule 对象,并且我想在一个查询中获取它的所有 ScheduleItems 及其关联的 Recipes。在 Parse 中,我可以设置这个查询:
PFQuery *query = [PFQuery queryWithClassName:@"Schedule"];
[query includeKey:@"scheduleItems.recipe"];
并且该查询将获取所有 scheduleItems 及其所有食谱,让我不必执行多个网络请求。
在 CloudKit 中有没有办法做到这一点?我看到我可以使用 CKFetchRecordsOperation
一次获取多个记录给定的记录 ID,但是在我已经获取 scheduleItems 之前我不知道食谱的记录 ID,因此仍然需要第二个网络请求。
CloudKit 不是关系数据库。这是一个键值存储。没有在一个查询中查询多个 recordType 的功能。也没有聚合查询的功能。在你的情况下,因为它是一对一的关系,你可以通过在你的食谱中添加一个 CKReference 到 Schedule 来将它限制为 2 个查询。那么如果你有一个时间表,你可以做一个查询来获取所有相关的 ScheduleItem 和另一个查询来获取所有相关的食谱
即将到来的版本 ('16) 中有一种方法:您可以定义 parent 关系,然后获取 parent 记录将导致 children 也被获取.这在 WWDC session“CloudKit 的新增功能”(2016 年)中有所介绍:https://developer.apple.com/videos/play/wwdc2016/226/
更正,'16 中引入的 parent 引用不是为了使执行单个提取成为可能,而是在使用 [=15= 的新共享部分时自动共享所有后代].所以答案是否定的,还是没办法,但是共享记录的时候,稍微不那么繁琐。
随着 Parse 即将消亡,我正在使用 CloudKit 重写一个应用程序。假设我正在制作一个食谱计划应用程序。我想要一个给定的时间表包含一个有序的食谱列表,并且食谱可以在多个时间表中。所以我有:
- 一个 Schedule 对象,它与名为 "scheduleItems" 的 ScheduleItem 对象具有一对多关系
- ScheduleItem 对象有一个 dayOfWeek 字段,并且与名为 "recipe" 的 Recipe 对象存在一对一关系
- 一个 Recipe 对象有一些信息,包括它的名称和成分(更多关系)
假设我有 Schedule 对象,并且我想在一个查询中获取它的所有 ScheduleItems 及其关联的 Recipes。在 Parse 中,我可以设置这个查询:
PFQuery *query = [PFQuery queryWithClassName:@"Schedule"];
[query includeKey:@"scheduleItems.recipe"];
并且该查询将获取所有 scheduleItems 及其所有食谱,让我不必执行多个网络请求。
在 CloudKit 中有没有办法做到这一点?我看到我可以使用 CKFetchRecordsOperation
一次获取多个记录给定的记录 ID,但是在我已经获取 scheduleItems 之前我不知道食谱的记录 ID,因此仍然需要第二个网络请求。
CloudKit 不是关系数据库。这是一个键值存储。没有在一个查询中查询多个 recordType 的功能。也没有聚合查询的功能。在你的情况下,因为它是一对一的关系,你可以通过在你的食谱中添加一个 CKReference 到 Schedule 来将它限制为 2 个查询。那么如果你有一个时间表,你可以做一个查询来获取所有相关的 ScheduleItem 和另一个查询来获取所有相关的食谱
即将到来的版本 ('16) 中有一种方法:您可以定义 parent 关系,然后获取 parent 记录将导致 children 也被获取.这在 WWDC session“CloudKit 的新增功能”(2016 年)中有所介绍:https://developer.apple.com/videos/play/wwdc2016/226/
更正,'16 中引入的 parent 引用不是为了使执行单个提取成为可能,而是在使用 [=15= 的新共享部分时自动共享所有后代].所以答案是否定的,还是没办法,但是共享记录的时候,稍微不那么繁琐。