2011-07-22 7 views
0

マイオブジェクトグラフは、このCore Dataは、多くの関係にして - サブクエリでALLでNSPredicateを作成

スナップショットのように見えます - >>ペイン - > ManagedImage

私はスナップショットを見つけようとしていること正確なManagedImagesがセットに含まれています。

このコードでは、1つ以上のManagedImagesがセットに含まれているSnapShotsの配列を返します。次に、配列を検索して正しいSnapShotを検索しますが、サブクエリでフィルタリングするほうがはるかに高速になると思います。

NSPredicateを使用すると、どのManagedImagesがセット?

は、ここに私のコードです

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オブジェクトのセットを持っているので、あなたがしなければならないすべてはのキーパスを歩いて各ManagedImageオブジェクトに関連付けられたSnapShotオブジェクトを見つけるには、pane.snapShotまたはpanes.snapShotsを使用します。次に、固有のSnapShotオブジェクトを抽出するだけです。最初のケースで

第2のケースで

ManagedImage-->Pane-->SnapShot 

の1対1の関係のパスを、あなたが最初にすべてのユニークなスナップショットオブジェクトを取得する必要がありますので、問題は重要ではありません。

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

...各ManagedImageインスタンスに対して、setByAddingObjectsFromSet:またはすべてのセットをマージして、一意のオブジェクトの単一セットを生成します。

必要なグラフの最初のオブジェクトを見つけるためにフェッチを使用する必要がありますが、オブジェクトを取得すると、フェッチはしませんが、関係を歩いていきます。それ以外の場合は、最初に関係を持つことにはあまり意味がありません。

関連する問題