使用 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 属性。所以假设你使用过c2b
和b2a
这样的东西应该可以工作:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"c2b.b2a.type == %@",[NSNumber numberWithInt:0]];
NSArray *result = [c_array filteredArrayUsingPredicate:predicate];
我还注意到您将A
的type
属性与谓词中的一个int 进行比较。只需寻找 i 为 0 的 type==%i
将返回所有在 type
中没有值的对象。因此,要么将 type
与 NSNumber
对象进行比较,要么将 type.intValue
与 int 进行比较。
【讨论】:
感谢您的回复:)我已经通过逐行检查解决了这个问题。当我添加 B 时,我发现我错过了 C 和 B 之间的一个关系。对不起我的愚蠢错误。但是您指出 NSNumber 问题,这对我有帮助,谢谢。以上是关于使用 NSPredicate 过滤核心数据中的对象的主要内容,如果未能解决你的问题,请参考以下文章
核心数据 - NSPredicate 过滤掉工作不正确的空字符串
使用 NSPredicate 对表视图中的核心数据进行排序 (Swift)