2010-01-05 29 views
21

我有三个实体:EntityA,EntityB和EntityC连接到多对多的关系。建立NSPredicate与更深层次的关系有什么更好的方法?

详情参见模式:

alt text http://img706.imageshack.us/img706/9974/screenshot20091220at124.png

为了得到EntityA的所有实例,它依赖从EntityB.name我用谓词是这样的:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY EntityB.name like 'SomeName'"]; 

应该是什么谓语为获得从EntityC.name依赖的EntityA的所有实例? 我试过像@"ANY EntityB.entitiesC.name like 'SomeName'"这样的查询,但得到异常"multiple to-many keys not allowed here"

最好的问候,

维克多

回答

12

我最终的解决方案是使用SUBQUERY。

NSPredicate *p = [NSpredicate predicateWithFormat:@"(name like %@) AND (0 != SUBQUERY(entitiesB, $x, (0 != SUBQUERY($x.entitiesC, $y, $y.name like %@)[email protected]))[email protected])", nameA, nameC]; 

不幸的是,我无法展开nsExpression对象上的这个查询。

+0

这是否适用于Mac OS和iOS的SQLite存储?从Apple文档(从iOS 5.0库:核心数据编程指南“持久存储特性”获取谓词和排序描述符 - 对于Mac OS可能会有所不同): “对于您可以使用的谓词还有其他限制SQLite存储: 您无法将“任意”SQL查询转换为谓词。“ – Dalmazio 2011-11-08 09:51:06

+0

我没有在Mac OS上测试过它,但是对于iOS来说它的工作正常。 – Victor 2011-11-08 17:26:05

2

当我在以下决定停止:

首先,我得到的所有EntityC满足条件EntityC.name等于 'SomeName'

NSPredicate *p = [NSPredicate predicateWithFormat:@"name like %@", @"SomeName]; 

...

NSArray *res = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

然后我得到EntityB的阵列从上述查询

NSArray *parentBs = [res valueForKeyPath:@"@distinctUnionOfObjects.parent"]; 

比得到EntityB的阵列满足条件EntityB.EntitiesC.name等于“SomeName”:

NSExpression *leftExpression = [NSExpression expressionForEvaluatedObject]; 
NSExpression *rightExpression = [NSExpression expressionForConstantValue:parentBs]; 

NSPredicate *p = [NSComparisonPredicate predicateWithLeftExpression:leftExpression rightExpression: rightExpression modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0]; 

我重复与EntityA相同。

该解决方案的有效性值得怀疑,我仍然期望为此问题提供更好的解决方案。

相关问题