So richten Sie NSpredicate und NSentityDescription in Coredata ein, um eine komplizierte SQL -Abfrage durchzuführen

StackOverflow https://stackoverflow.com/questions/2241980

Frage

Ich weiß, wie man nSpredicate erstellt, um SQL wie zu tun "SELECT * FROM DRINK". Aber wie wäre es mit dieser Frage:

"SELECT I.name, D_I.amount 
FROM DRINK_INGREDIENT D_I, DRINK, INGREDIENT I 
WHERE D_I.drinkID=1 AND DRINK.drinkID=1 AND I.ingredientID = D_I.ingredientID;"  

Wie setze ich überhaupt die NSentityDescription und nSpredicate für diese Art von Abfrage?

War es hilfreich?

Lösung

In der Regel entwerfen und verwenden Sie ein Datenmodell, das Ihren Anforderungen entspricht. Sie sollten nicht in Bezug auf SQL darüber nachdenken-es muss nicht einmal SQL zur Speicherung verwenden-, wenn Sie versuchen, eine SQL-Abfrage direkt in eine Abrufanforderung mit einem Prädikat zu übersetzen, usw.

Trotzdem kann es manchmal hilfreich sein, in SQL zu denken, wo Klauseln beim Erstellen von Prädikaten, aber wirklich darauf abzielen, welche Entität Sie erhalten und wie die Sammlung gefiltert und/oder sortiert werden sollte usw.

Abrufenanfragen sind auf eine einzelne Entität beschränkt. Ich denke, Sie würden mehrere Abrufanfragen benötigen, um Ihre Abfrage zu simulieren.

Wie sieht Ihr Kerndatenmodell aus? Was versuchst du zu erreichen? Was hast du bisher versucht?

AKTUALISIEREN
Es hört sich so an, als ob Ihr Datenmodell zwei Entitäten umfasst: Getränke und Zutat mit einer vielen zu viele Beziehung zwischen ihnen:

Trinken <<->> Zutat

Beachten Sie, dass es in Kerndaten keine Trinkdarstellungseinheit gibt, es sei denn, Sie erstellen sie ausdrücklich (es gibt eine zusätzliche Tabelle für die viel-zu-Viele-Beziehung, aber sie wird von Ihnen entfernt). Da Sie in der zusätzlichen Tabelle einen mit den Zeilen zugeordneten Betragswert zugeordnet haben, würde ich empfehlen, eine Trinkvorstellung in Kerndaten hinzuzufügen:

Getränk <->> trinkReduction <<-> Zutat

Hinweis: Ein Trinkraum hat genau ein Getränk und eine Zutat. Getränke können viele Trinkleiter haben und Zutaten können von vielen Trinkern verwendet werden.

Es hört sich so an, als ob Sie den Namen und die Menge für die Liste der Zutaten für ein bestimmtes Getränk erhalten möchten. Zu diesem Zweck holen Sie sich einfach Trinkanleitung Objekte mit einem Filterprädikat wie folgt:

// assuming "aDrink" is a reference to a particular Drink object
// and "drink" is the relationship from DrinkIngredient to Drink
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"drink == %@",aDrink];

// if the fetch request result array is named "ingredientList"
// and the relationship from DrinkIngredient to Ingredient is "ingredient"
for (DrinkIngredient *di in ingredientList) {
    NSString *ingredientName = di.ingredient.name;
    NSUInteger amount = di.amount.integerValue;

    // use "ingredientName" and "amount" here
}

Da Sie Kerndaten verwenden und nicht SQL, machen Sie die Dinge anders. Wenn Sie beispielsweise eine Zutatenliste mit Namen und Betrag für alle Getränke anzeigen möchten, würden Sie einfach alle Getränkeobjekte (kein Filterprädikat) holen und über die Beziehung vom Getränk bis zum Trinken zugreifen.

Auch hier sollten Sie darüber nachdenken, was Sie angemessen erreichen und entwerfen und angemessen verwenden. Sie sollten nicht über SQL oder Abfragen nachdenken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top