2010-09-27 43 views
0

鉴于下列核心数据模型中定义的实体:因此,在ANSPredicate为一对多的关系,其中一个关系(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和涉及BjBk所有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]]; 

我怎么可以重写谓词,使其更通用?它必须是那么明显,但我没有看到它......

回答

2

是否

[NSPredicate predicateWithFormat:@"A==%@ AND (ALL %@ IN Bs)", Ax, myArray]; 

你期待什么?我不确定(并且远离我的OS X框)此谓词是否可转换为SQL核心数据SQLite引擎。您可能需要一个SUBQUERY表达:

[NSPredicate preidcateWithFormat:@"A==%@ and SUBQUERY(Bs, $x, $x IN %@)[email protected] == %d", Ax, myArray, myArray.count]; 

这里假定myArray的项目是独一无二的。

+0

Thx为快速响应。你的第一个解决方案引发一个Exception:不支持的谓词(null)。第二部作品(不得不解决@count和失踪)。但速度很慢。我的硬编码解决方案大约需要0.012秒,而子查询解决方案大约需要10秒... – codeclash 2010-09-27 21:03:50

+0

不幸的是,您所要求的(通用解决方案)与对关系引擎的高效SQL查询间接冲突。我认为你必须选择一个或另一个。完全是什么语法错误?我会纠正这个帖子。 – 2010-09-27 21:09:41

+0

呵呵。你是否已经修改了查询?或者我是否将您的解决方案与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

相关问题