2012-06-14 3 views
9

Mit Core-Daten möchte ich einige Daten abrufen. Mein Modell verwendet einige abstrakte Entitäten, siehe angehängtes Bild, wo QuantifiedIngredient eine abstrakte Klasse ist. Ich möchte Ingredient entities holen, die mindestens einen RecipeQuantifiedIngredients haben, aber in der Mitte ist QuantificationIngredient, eine abstrakte Klasse.Wie kann ich den Klassentyp einer abstrakten Entität in einem NSPredate kennen?

Wie kann ich das tun, wie kann ich den tatsächlichen Typ einer abstrakten Klasse innerhalb eines NSPredicate testen? Irgendeine Idee oder Anregung?

enter image description here

Der einzige Hinweis fand ich war: How can you reference child entity name in a predicate for a fetch request of the parent entity?

eine benutzerdefinierte Eigenschaft in meinem QuantifiedIngredient funktionieren würde zu wissen, ob es ein RecipeQuantifiedIngredient ist? Zum Beispiel isRecipeQuantifiedIngredient?

Vielen Dank für Ihre Hilfe.

Antwort

1

Ich will nicht die Zeit nehmen, diese in Coredata-sprechen zu übersetzen, so ist hier meine Gedanken in SQL:

SELECT * FROM quantifiedIngredients WHERE recipe <> NULL 

oder so ähnlich. Dies ist im Wesentlichen der Vorschlag von Nikita, eine Flagge zu verwenden, außer dass die "Flagge" die Existenz einer Eigenschaft ist. Ich weiß nicht, wie CoreData reagieren wird, wenn GroceryQuantifiedIngredients konfrontiert wird, die die recipe nicht haben, denke ich, dass KVO eine Ausnahme werfen wird. Sie könnten so kühn sein, um eine Kategorie hinzuzufügen:

@interface GroceryQuantifiedIngredients (KVOHack) 
-(id)recipe; 
@end 

@implementation GroceryQuantifiedIngredients (KVOHack) 
-(id) recipe { return nil; } 
@end 

Dies würde natürlich erfordern Coredata alle quantifiedIngredients aufzuzählen, aber ich vermute, es wird so irgendwie zu tun haben, und eine der return nil in winzige Code optimieren soll. Die andere Überlegung ist, ob sich dies auf den Rest Ihres Codes negativ auswirkt. Sie müssen diesen Anruf tätigen.

Eine weitere Idee, die, wie ich so etwas wie dies zu tun, beenden in den Sinn erscheint ist (ich bin immer wirklich lose jetzt mit meinem Pseudo-Code):

SELECT * FROM quantifiedIngredients WHERE [i respondsToSelector:@selector(recipe)]; 

Sehen Sie, was ich meine? Ich vergesse, dass CoreData Sie mit einer Art von Cursor spielen kann, wenn Sie mit Prädikaten oder abgeholten Thingamabobbers arbeiten, wenn dies der Fall ist, dann denke ich, dass dies die beste Wahl ist. Jedenfalls ist es Sonntagnachmittag, so dass das Zeug als Übung für den Leser übrig bleibt.

+1 für eine gute Frage.

+0

Das Problem besteht darin, dass SQL das Entity-Relationship-Modell verwendet, in dem keine Vererbungs- oder Viele-zu-Viele-Beziehungen bestehen. Daher macht das Arbeiten auf SQL-Ebene keinen Sinn, da Core Data ein Objektmodell (mit Vererbungs- und Viele-zu-Viele-Beziehungen) verwendet.Also, was Sie sagen, es ist wie ein Programm in C++ zu erstellen und einige Änderungen in Assembler (nicht so schwer, natürlich). – Ricardo

+0

Was Sie sagen, über die Antworten, die ich suche, scheint es gibt etwas Call className, aber es funktioniert nicht mit SQL persistent Speicher, aber es funktioniert mit anderen. Das ist neugierig. Abgesehen von className oder answersToSelector, was ist mit Casting? Ich habe vor einer Woche eine E-Mail an Apple geschickt und sie haben mir gesagt, dass sie darüber recherchieren müssen (es ist eine bezahlte Frage). – Ricardo

+0

Sie haben keine Antwort, aber was Sie gesagt haben, ist sehr interessant. Danke vielmals. – Ricardo

2

Wenn recipe in RecipeQuantifiedIngredient erforderlich ist, können Sie versuchen, einen Abruf durchzuführen, der überprüft, ob es einen ingredient.recipe gibt. Ich denke, das wird funktionieren.

Die benutzerdefinierte Eigenschaft, in Form von Flagge, wird auch für Sie arbeiten. Sie müssen es nur einstellen und aufheben, wenn Sie alle recipeQuantifiedIngredient hinzufügen oder löschen.

+0

Die eigentliche Frage, ob es möglich ist, mit der Vererbung von NSPredate fertig zu werden. Ich habe bereits darüber nachgedacht, eine Flagge hinzuzufügen, aber vom Standpunkt der Modellierung aus gesehen ist es eine fiese Lösung, obwohl dies eine Umgehungslösung sein könnte. Danke trotzdem. – Ricardo

Verwandte Themen