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

时间:2012-10-12 08:50:52

标签: objective-c ios core-data nspredicate

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

它们之间的关系是:A< - >> B,B< - > C.

A有一个名为'type'的属性。

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

我要做的是使用NSPredicate来过滤A和C的属性'type'。

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 个答案:

答案 0 :(得分:0)

听起来你想要反过来做。你已经有了C,并且根据你描述的关系,你的C类将有一个B属性,你的B类将有一个A属性。因此,假设您已使用c2bb2a这样的事情应该有效:

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

NSArray *result = [c_array filteredArrayUsingPredicate:predicate];

另外,我注意到您正在将type的{​​{1}}属性与谓词中的int进行比较。只查找i为0的A将返回type==%i中没有值的所有对象。因此要么将typetype对象进行比较,要么将NSNumber与int进行比较。