核心数据与多种关系 - 在SUBQUERY中使用ALL创建NSPredicate

时间:2011-07-22 23:27:21

标签: ios core-data nspredicate

我的对象图看起来像这样

SnapShot - >>窗格 - > ManagedImage

我正在尝试找到一个SnapShot,其中包含一套精确的ManagedImages。

我现在获得的代码返回一个SnapShot数组,其中包含一个或多个ManagedImages。然后我搜索数组以找到正确的SnapShot,但我猜测在子查询中过滤会快得多

使用NSPredicate如何获得具有该集合中所有ManagedImages的独特SnapShot?

这是我的代码

mySet = ... // A unique set of (usually 3) managedImages that I'm trying to find a snapShot for

NSFetchRequest *request = ...
request.entity = [NSEntityDescription entityForName:@"SnapShot" inManagedObjectContext:[self managedObjectContext]];

// Want this to work but sends an exception
//request.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(self.panes, $pane, ALL $pane.managedImage IN %@).@count != 0", mySet];

// Using this
request.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(self.panes, $pane, $pane.managedImage IN %@).@count != 0", mySet];

1 个答案:

答案 0 :(得分:0)

一个好的经验法则是,如果您已经拥有托管对象,则不会获取,而是将您拥有的托管对象之间的关系转移到所需的托管对象。

所以,你的关系图实际上可能是这样的:

SnapShot <-->> Pane <--> ManagedImage

或者也许:

SnapShot <<-->> Pane <<--> ManagedImage

由于您有一组ManagedImage个对象,所以您只需走pane.snapShotpanes.snapShots的关键路径,找到与每个SnapShot关联的ManagedImage个对象1}}对象。然后,您只需提取唯一的SnapShot个对象。

在第一种情况下,由于

的一对一关系路径,事情是微不足道的
ManagedImage-->Pane-->SnapShot

在第二种情况下,您需要先获取所有唯一的SnapShot对象:

NSSet *shots=[aMangedImageObj valueForKeyPath:@"distinctUnionOfSets.panes.snapShots"];

...对于每个ManagedImage个实例,然后将所有集合与setByAddingObjectsFromSet:或类似的方法合并,以生成一组唯一对象。

应该使用Fetches来查找图形中您需要的第一个对象,但是一旦拥有了这些对象,就不会获取但是可以移动关系。否则,首先要建立关系并不重要。