2011-07-22 50 views
0

我的對象圖看起來像這樣核心數據與一對多的關係 - 在SUBQUERY創建一個NSPredicate與ALL

快照 - >>面板 - > ManagedImage

我試圖找到一個快照具有確切的ManagedImages包含在一個集合中。

我現在得到的代碼返回一組具有一組或多組ManagedImages的SnapShots。然後我搜索數組以找到正確的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 %@)[email protected] != 0", mySet]; 

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

回答

0

一個好的經驗法則是,如果你已經在手管理的對象,你不取,而是從你的管理對象的管理對象走關係你要。

所以,你的關係圖可能實際上是這樣的:

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

或可能:

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

既然你有一組ManagedImage對象的所有你需要做的就是走的的keyPath pane.snapShotpanes.snapShots找到與每個ManagedImage對象相關聯的對象SnapShot。然後,您只需提取獨特的SnapShot對象。

在第一種情況下,這個問題是因爲

ManagedImage-->Pane-->SnapShot 

一比一的關係路徑在第二種情況中的小事,你需要先得到所有的獨特的SnapShot對象:

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

...對於每個ManagedImage實例,然後將所有集合與setByAddingObjectsFromSet:或類似的方法合併以產生一組唯一對象。

提取應該用來找到你需要的圖形中的第一個對象,但是一旦你有了這些對象,你就不會獲取,而是走過關係。否則,首先建立關係沒有多大意義。