2015-03-24 15 views
10

Ich versuche zu verstehen, wie komplexe Datenbeziehungen mit Core Data modelliert werden.iOS Swift - Core Data Beispiele mit einer komplexen Datenbeziehung

Mit meiner App habe ich derzeit eine Einheit von Rezept, Zutat und Rezept Ingredient, die Zutaten zu einem Rezept binden.

Ich habe kein Beispiel für das Abrufen von Daten aus dieser gemeinsamen Entität gefunden. Ich würde es begrüßen, wenn jemand in Swift ein Beispiel für eine Entität wie meinen Rezept-Ingredient geben könnte.

+2

Was ist es, dass Sie nicht verstehen, und dass Sie hoffen, von einem Beispiel lernen? –

Antwort

15

Der Grund, warum Sie keine ähnlichen Beispiele wie Ihre RecipeIngredient Entität gesehen haben, ist, dass Sie keine gemeinsamen Entitäten wie diese in Core Data benötigen. Sie behandeln Core Data wie eine relationale Datenbank, in der Sie normalerweise eine Join-Tabelle verwenden, um effiziente Viele-zu-Viele-Beziehungen zwischen Entitäten zu erstellen. Wie in der Many-to-Many Relationships Unterabschnitt der Core Data Programming Guide, mit Core-Daten, alles, was Sie tun müssen, ist nur eine to-viele Beziehung in beide Richtungen zwischen zwei Entitäten anzugeben. Beachten Sie die Bemerkung in der Dokumentation:

(Wenn Sie einen Hintergrund in der Datenbank-Management haben und dies bewirkt, dass Sie Sorge, keine Sorge: Wenn Sie einen SQLite-Speicher zu verwenden, Core Data erstellt automatisch die Zwischen beitreten . Sie Tabelle)

Hier ist eine Darstellung der Beziehung, wie Sie es modellieren sollte, riss gerade von Xcode Modelleditor:

many-to-many

Wenn Sie immer noch Beispiele sehen möchten, wie Sie dies tun, suchen Sie nach "Core Data viele zu vielen Beziehungen" und Sie werden genug finden. Sie könnten hier auf StackOverflow starten; Eine schnelle Suche ergab eine Reihe von Beispielen, einschließlich How do you manage and use "Many to many" core data relationships?.

Aktualisierung: Von Ihrem Kommentar verstehe ich, dass Sie ein Zwischenobjekt verwenden möchten, um Informationen über die Beziehung zwischen Rezepten und Zutaten hinzuzufügen. Das ist ein Fall, in dem eine andere Entität garantiert ist. Also lassen Sie uns sagen, Ihr Modell sieht wie folgt aus:

updated model

Es scheint unwahrscheinlich, dass Sie eine dieser RecipeIngredient Objekte holen wollen würde direkt; Du würdest wahrscheinlich einfach der entsprechenden Beziehung folgen. Sie können also eine Abrufanforderung erstellen, um alle Rezepte zu finden, deren Name mit @ "Schokoladenkuchen" übereinstimmt. (Es gibt viele Beispiele für Abrufanforderungen, die ein Prädikat in den Dokumenten und im gesamten Netzwerk verwenden. Daher werde ich das hier nicht tun.) Ihre Abrufanforderung gibt ein Array mit Rezepten zurück, die wir aufrufen könnten: cakeRecipes, aber Sie sind wahrscheinlich nur an einem interessiert:

Recipe *cake = cakeRecipes.firstObject; 

Nun, was möchten Sie über die Zutaten für Ihren Kuchen wissen? Hier ist eine Liste der Zutaten:

NSArray *ingredientNames = cake.ingredients.ingredient.name; 

Wenn Sie die Zutat Namen und Beträge möchten log:

for (RecipeIngredient *i in cake.ingredients) { 
    NSLog(@"%@ %@", i.amount, i.ingredient.name); 
} 

Oder man könnte eine Anfrage holen verwenden, um die Zutaten matching „Sellerie“ zu finden Speichern des Ergebnisses in celeries.Danach könnten Sie für Rezepte mit Sellerie aussehen:

Ingredient *celery = celeries.firstObject; 
NSArray *recipes = celery.recipes.recipe 

Wenn dies nicht hilft, vielleicht könnten Sie über das Problem genauer sein. Außerdem weiß ich, dass du nach Swift gefragt hast, aber meine Finger sind immer noch an Obj-C gewöhnt, und die Sprachspezifikationen spielen hier keine Rolle - Core Data funktioniert in beiden Sprachen gleich.

+0

Danke. Ich verstehe, dass Core Data nicht wie eine relationale Datenbank funktioniert. Wenn Sie sich den Abschnitt Viele-zu-Viele-Beziehungen des Core Data-Dokuments ansehen, handelt es sich um eine Zwischen- (Joint) -Entität, bei der es sich um ein zusätzliches Attribut handelt - in meinem Fall ein Kennzahlenattribut in der Entität RecipeIngredient. Ich würde gerne lernen, wie der Prozess für diese gemeinsame Entität ausgeführt wird. –

+0

Das macht Sinn, aber war nicht aus Ihrer Frage ersichtlich. Ich sehe jedoch nicht, dass das Holen ein Problem ist. Es ist unwahrscheinlich, dass du die Zwischeneinheit von alleine holen willst, oder? Verwenden Sie also einfach die entsprechende Eigenschaft eines verwalteten Objekts (wie eines Rezepts), das Sie bereits an das Zwischenobjekt haben müssen. Ich werde die Antwort aktualisieren ... – Caleb

+1

Vielen Dank für die Zeit nehmen und teilen Sie Ihr Wissen. Es ist jetzt viel klarer. –

Verwandte Themen