2009-10-06 4 views
28

Ich habe ein Core Data-Modell Setup wie so:Wie erstellt man einen NSFetchRequest, der Core Data-Objekte basierend auf Attributen und Beziehungen filtert?

  • Blockbuster Entity
    • -Beziehung zu DVD Einheiten.
  • DVD Entity
    • Titel Attribut (string)
    • zu-Eins-Beziehung zu einem Elternteil Blockbuster Einheit

Eine einzelne Blockbuster haben kann mehrere DVDs darin (To-Many). Jede DVD kann nur Teil eines einzelnen Blockbusters (To-One) sein.

Es gibt mehrere Blockbuster, und einige können DVD-Entities enthalten, die denselben Titel wie DVD-Entities von anderen Blockbustern haben. Zum Beispiel Blockbuster A könnte eine Kopie von "Transformers 2" haben, und so funktioniert Blockbuster C und Blockbuster G. Stellen wir uns vor, dass kein Blockbuster mehr als eine Kopie des gleichnamigen Films hat.

Ich bin daran interessiert, die Transformers 2 DVD von Blockbuster C in Grabbing. Ich will nicht die Kopien von Blockbuster A oder G, weil mein Chef dort frequentiert, und ich kann nur mit dem Brennen dieses Stück Müll in Blockbuster C kommen.


Meine Frage ist, wie kann ich eine NSFetchRequest bilden, schnappt sich eine DVD mit den Titel „Transformers 2“, die ein Kind der ist Blockbuster „C“ übergeordnete Entität?

Diese Art der Anfrage wird greifen alle „Transformer 2“ DVDs, aber nicht die, die spezifisch für die Blockbuster C Einheit:

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]; 

Gibt es eine Möglichkeit, sagen wir, die Objekt-ID eines zu übergeben verwandtes Objekt innerhalb des NSPredicates, Filterung darauf?

Antwort

46

Sie können Beziehungen in einem NSPredicate durchlaufen.Zum Beispiel könnten Sie so etwas wie

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

Jetzt schreiben, wenn man gegen keine Eigenschaft haben, zu vergleichen und Sie müssen tatsächliche Objekte überprüfen, dann könnte man so etwas wie

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

Die Verwendung Die vollständige Syntax ist dokumentiert here. Aber setOfBlockbusters könnte ein Satz, ein Array oder ein Wörterbuch sein (wenn es ein Wörterbuch ist, werden die Werte, nicht die Schlüssel, verwendet).

+0

Vielen Dank, das ist es! Und danke für den Link zu den Dokumenten. Sehr hilfreich. :) –