0
鉴于下列核心数据模型中定义的实体:因此,在A
类NSPredicate为一对多的关系,其中一个关系(NSSet中)必须包含在一个NSArray
-> : to-one releationship
->>: to-many relationship
Entity A ->> Entity B
Entity B -> A // each B belongs to exactly one A
Entity B ->> B // a B can be related to other B's
:
@property (nonatomic, retain) NSSet *Bs;
在类B
:
@property (nonatomic, retain) A *A;
@property (nonatomic, retain) NSSet *Bs;
假设我有一个NSArray *myArray
包含ing (Bj, Bk)
。
我要的是获取属于Ax
和涉及Bj
和Bk
所有B
的:
以下作品的代码,但完全是丑陋的,因为我有硬编码NSPredicate基础对数(这里是2,但它可能是10左右)的阵列中的B
的:
NSEntityDescription *fetchedEntity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:self.managedObjectContext];
[NSPredicate predicateWithFormat:@"A == %@ and (Bs contains %@) and (Bs contains %@)", Ax, [myArray objectAtIndex:0], [myArray objectAtIndex:1]];
我怎么可以重写谓词,使其更通用?它必须是那么明显,但我没有看到它......
Thx为快速响应。你的第一个解决方案引发一个Exception:不支持的谓词(null)。第二部作品(不得不解决@count和失踪)。但速度很慢。我的硬编码解决方案大约需要0.012秒,而子查询解决方案大约需要10秒... – codeclash 2010-09-27 21:03:50
不幸的是,您所要求的(通用解决方案)与对关系引擎的高效SQL查询间接冲突。我认为你必须选择一个或另一个。完全是什么语法错误?我会纠正这个帖子。 – 2010-09-27 21:09:41
呵呵。你是否已经修改了查询?或者我是否将您的解决方案与SUBQUERY文档中的解决方案混合在一起?我的不好:你的解决方案完美地工作,对不起,它很有用,平均时间为0.000016秒!我想我把你的解决方案与文档中的一个混合在一起:NSPredicate * predicate = [NSPredicate predicateWithFormat:@“A ==%@ and(SUBQUERY(Bs,$ x,$ x IN%@)。@ count == Bs。@ count)“,Ax,myArray,myArray.count];这个非常糟糕,平均需要10秒左右。因为Bs。@ count!非常感谢,拯救了我的一天! – codeclash 2010-09-27 21:28:35