使用 NSPredicate 过滤核心数据中的对象

Posted

技术标签:

【中文标题】使用 NSPredicate 过滤核心数据中的对象【英文标题】:Use NSPredicate to filter object in core data 【发布时间】:2012-10-12 08:50:52 【问题描述】:

我有三个实体 A、B、C。

它们之间的关系是:A >B,BC。

A 有一个名为“类型”的属性。

A和B的关系是a2b,B和C的关系是b2c。 c_array 是 C 对象的列表。

我正在尝试做的是使用 NSPredicate 通过 C 和 A 的属性“类型”过滤 A。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"A" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSMutableArray *parr = [NSMutableArray array];

for (C *c in c_array) 
  [parr addObject:[NSPredicate predicateWithFormat:@"ANY a2b.b2c = %@", c]];


NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:[NSCompoundPredicate orPredicateWithSubpredicates:parr], [NSPredicate predicateWithFormat:@"type = %i", 0], nil]];

[fetchRequest setPredicate:predicate];

但我得到的不是我所期望的。所以我也尝试了其他的。

predicate = [NSPredicate predicateWithFormat:@"type=%i AND (0!=SUBQUERY(a2b,$a2b,$a2b.b2c IN %@).@count)", 0, c_array];

意外的结果又发生了!有人可以帮帮我吗? T T

【问题讨论】:

【参考方案1】:

听起来你想反其道而行之。您已经有了 C,并且根据您所描述的关系,您的 C 类将具有 B 属性,而您的 B 类将具有 A 属性。所以假设你使用过c2bb2a 这样的东西应该可以工作:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"c2b.b2a.type == %@",[NSNumber numberWithInt:0]];

NSArray *result = [c_array filteredArrayUsingPredicate:predicate];

我还注意到您将Atype 属性与谓词中的一个int 进行比较。只需寻找 i 为 0 的 type==%i 将返回所有在 type 中没有值的对象。因此,要么将 typeNSNumber 对象进行比较,要么将 type.intValue 与 int 进行比较。

【讨论】:

感谢您的回复:)我已经通过逐行检查解决了这个问题。当我添加 B 时,我发现我错过了 C 和 B 之间的一个关系。对不起我的愚蠢错误。但是您指出 NSNumber 问题,这对我有帮助,谢谢。

以上是关于使用 NSPredicate 过滤核心数据中的对象的主要内容,如果未能解决你的问题,请参考以下文章

带有核心数据对象的 NSPredicate

核心数据 - NSPredicate 过滤掉工作不正确的空字符串

NSPredicate 按属性过滤核心数据关系 NSSet

使用 NSPredicate 对表视图中的核心数据进行排序 (Swift)

如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?

使用 NSPredicate 过滤对象中的数组