我有三个实体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
答案 0 :(得分:0)
听起来你想要反过来做。你已经有了C,并且根据你描述的关系,你的C类将有一个B属性,你的B类将有一个A属性。因此,假设您已使用c2b
和b2a
这样的事情应该有效:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"c2b.b2a.type == %@",[NSNumber numberWithInt:0]];
NSArray *result = [c_array filteredArrayUsingPredicate:predicate];
另外,我注意到您正在将type
的{{1}}属性与谓词中的int进行比较。只查找i为0的A
将返回type==%i
中没有值的所有对象。因此要么将type
与type
对象进行比较,要么将NSNumber
与int进行比较。