【问题标题】:NSPredicate on nested object / NSSet to filter the result during NSFetchRequest嵌套对象/NSSet 上的 NSPredicate 用于在 NSFetchRequest 期间过滤结果
【发布时间】:2012-08-09 17:01:39
【问题描述】:

我想要一个简单的谓词,它返回所有模式 = 0 的组和组中的注册模式 = 0

确切地说,我需要一个谓词来访问嵌套对象的属性。 不知何故,像这样的谓词:

[NSPredicate predicateWithFormat:@"mode = 0 AND enrollments.Enrollment.mode = 0"]

上面的谓词是错误的,显然是行不通的。

已编辑:

我也尝试过以下谓词,但没有成功。

[NSPredicate predicateWithFormat:@"mode = 0 AND ALL ( SUBQUERY(enrollments,$varEnrollment,$varEnrollment.mode = 0))"]

我需要包含所有处于活动状态的组 (group.mode = 0) 以及所有处于活动状态的参与者 (enrolles.mode = 0) 的结果 但对我来说,这个谓词不起作用。

【问题讨论】:

  • 一个组有很多注册,那么“组中注册的模式 = 0”到底是什么意思?
  • 我也需要在enrollment.mode上应用过滤器,这样它才能反映整体结果。
  • 正如我所说,如果我正确阅读图表,一个小组会有多个注册。您的意思是“组的所有注册的模式 = 0”吗?
  • YES group.mode = 0 和enrollment.mode = 0

标签: core-data filter nspredicate nsfetchrequest nested-set-model


【解决方案1】:

从你的问题和我猜测你想要的cmets

[NSPredicate predicateWithFormat:@"mode = 0 AND (ALL enrollments.mode = 0)"]

更新

似乎 ALL 聚合不起作用。它抛出

'NSInvalidArgumentException', reason: 'Unsupported predicate (null)'

正如@yunas 所注意到的。之前也注意到了这一点,例如

另一方面,ANY 聚合可以正常工作。因此,作为 WORKAROUND,可以将 ALL 替换为等效的 ANY 表达式:

[NSPredicate predicateWithFormat:@"mode = 0 AND NOT(ANY enrollments.mode != 0)"];

这确实有效(我已经测试过了)!

更新 2

在讨论过程中,很明显 yunas 想要显示一个表格,其中每个组的模式为 0,并在表格行中显示该组的所有注册,模式为 0。

第一个解决方案(可能更好):首先用上面给出的方法找到所有可接受的组。对于每一行(cellForRowAtIndexPath:),过滤该组的注册并绘制单元格。

第二种解决方案: 获取所有注册并按组排序。这只需要一个 fetch 请求,但结果不太适合作为 table view 数据源。获取请求如下所示:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Enrollment"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"mode = 0 AND group.mode = 0"];
request.predicate = predicate;
NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"group.name" ascending:YES];
NSSortDescriptor *sort2 = [NSSortDescriptor sortDescriptorWithKey:@"share" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObjects:sort1, sort2, nil];

【讨论】:

  • 我们可以做吗(所有注册.mode = 0)???我遇到的问题是,我不知道如何访问嵌套对象属性。
  • 我不会给出这个答案我不太确信它是正确的。如果有效,您现在应该尝试。如果可行:好的,接受我的回答。如果没有:显示您的代码并再次询问。
  • 你也可以看看Predicate Programming Guide。它一开始就有像“ALL children.age > 12”这样的例子。
  • 这家伙说你不能引用子实体名称stackoverflow.com/questions/1579337/…
  • 那是一个完全不同的问题!您在这里没有任何子实体,并且您不需要获取请求中的实体名称。您有一个实体“Group”和另一个实体“Enrollment”,它们之间存在一对多关系。
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 2020-07-28
相关资源
最近更新 更多