2

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

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

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];

意想不到的结果又发生了!有人可以帮帮我吗?TT

4

1 回答 1

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属性与A您的谓词中的 int 进行比较。只需寻找type==%ii 在哪里 0 将返回所有在 中没有值的对象type。因此,要么与type对象NSNumbertype.intValueint 进行比较。

于 2012-10-12T18:31:34.287 回答