29

次のような Core Data モデルのセットアップがあります。

  • 大ヒットエンティティ
    • DVDエンティティとの対多関係。
  • DVDエンティティ
    • タイトル属性 (文字列)
    • ブロックバスターエンティティとの 1 対 1 の関係

1 つのブロックバスターに複数の DVD を含めることができます (To-Many)。各 DVD は、1 つの Blockbuster (To-One) の一部にしかできません。

複数のブロックバスターがあり、他のブロックバスターの DVD エンティティと同じタイトルを共有する DVD エンティティを含むものもあります。たとえば、ブロックバスター Aには「トランスフォーマー 2」のコピーがあり、ブロックバスター Cブロックバスター Gも同様です。ブロックバスターに同じタイトルの映画が複数あるとしましょう。

Blockbuster CからTransformers 2のDVDを手に入れたいと思っています。Blockbuster AまたはGのコピーは不要です。なぜなら、私の上司は頻繁にそこに行くからです。Blockbuster Cでこのごみを燃やすしか方法がありません。


私の質問は、 Blockbuster "C" 親エンティティの子である "Transformers 2"というタイトルのDVDを取得する NSFetchRequest をどのように形成すればよいですか?

このタイプのリクエストは、すべての「トランスフォーマー 2」DVD を取得しますが、Blockbuster C エンティティに固有のものは取得しません。

NSManagedObjectContext *moc = [self managedObjectContext];

NSString *aTitle = @"Transformers 2";
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", aTitle];
[request setEntity:[NSEntityDescription entityForName:@"DVD" inManagedObjectContext:moc]];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

// error handling code
[request release];

たとえば、NSPredicate 内の関連オブジェクトのオブジェクト ID を渡し、それに基づいてフィルタリングする方法はありますか?

4

1 に答える 1

47

でリレーションシップをトラバースできますNSPredicate。たとえば、次のように書くことができます

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster.name LIKE \"Blockbuster C\"", @"Transformers 2"]

比較するプロパティがなく、実際のオブジェクトを確認する必要がある場合は、次のようなものを使用できます

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster IN %@", @"Transformers 2", setOfBlockbusters]

完全な構文はここに文書化されています。ただしsetOfBlockbusters、セット、配列、または辞書の可能性があります (辞書の場合は、キーではなく値が使用されます)。

于 2009-10-06T21:13:22.000 に答える