web-dev-qa-db-ja.com

属性と関係に基づいてコアデータオブジェクトをフィルタリングするNSFetchRequestを作成する方法

私はそういうコアデータモデルを設定しています:

  • ブロックバスターエンティティ
    • [〜#〜] dvd [〜#〜]エンティティへの多対多の関係。
  • [〜#〜] dvd [〜#〜]エンティティ
    • title属性(文字列)
    • 親との1対1の関係Blockbusterエンティティ

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

複数のブロックバスターがあり、一部には他のブロックバスターのDVDエンティティと同じタイトルを共有するDVDエンティティが含まれている場合があります。たとえば、Blockbuster Aには「Transformers 2」のコピーがあり、Blockbuster CおよびBlockbuster G。同じタイトルの映画のコピーが複数あるBlockbusterがないとします。

Blockbuster CからTransformers 2DVDを取得することに興味があります。 Blockbuster Aまたは[〜#〜] g [〜#〜]、私のボスがそこに頻繁にいるので、私はこのゴミをBlockbuster Cで燃やすことでのみ逃れることができます。


私の質問は、子であるtitle "Transformers 2"で[〜#〜] dvd [〜#〜]を取得するNSFetchRequestをどのように形成するかです。 Blockbuster "C"親エンティティの?

このタイプのリクエストは、すべての「Transformer 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を渡して、それに基づいてフィルタリングする方法はありますか?

28
Dave Gallagher

NSPredicate内の関係をトラバースできます。たとえば、次のように書くことができます

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

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

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

完全な構文は here で文書化されています。ただし、setOfBlockbustersは、セット、配列、またはディクショナリにすることができます(ディクショナリの場合は、キーではなく値が使用されます)。

46
Alex