我的对象图看起来像这样
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];
答案 0 :(得分:0)
一个好的经验法则是,如果您已经拥有托管对象,则不会获取,而是将您拥有的托管对象之间的关系转移到所需的托管对象。
所以,你的关系图实际上可能是这样的:
SnapShot <-->> Pane <--> ManagedImage
或者也许:
SnapShot <<-->> Pane <<--> ManagedImage
由于您有一组ManagedImage
个对象,所以您只需走pane.snapShot
或panes.snapShots
的关键路径,找到与每个SnapShot
关联的ManagedImage
个对象1}}对象。然后,您只需提取唯一的SnapShot
个对象。
在第一种情况下,由于
的一对一关系路径,事情是微不足道的ManagedImage-->Pane-->SnapShot
在第二种情况下,您需要先获取所有唯一的SnapShot对象:
NSSet *shots=[aMangedImageObj valueForKeyPath:@"distinctUnionOfSets.panes.snapShots"];
...对于每个ManagedImage
个实例,然后将所有集合与setByAddingObjectsFromSet:
或类似的方法合并,以生成一组唯一对象。
应该使用Fetches来查找图形中您需要的第一个对象,但是一旦拥有了这些对象,就不会获取但是可以移动关系。否则,首先要建立关系并不重要。