CoreData One to Many

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CoreData One to Many

    Hey Leute,

    Ich bin gerade dabei mich in Core Data einzuarbeiten. Ich habe mir folgende Struktur rausgesucht...
    So wie ihr jetzt hoffentlich sieht hab ich eine one to many Verbindung von Rezepte zu Beilagen.
    Soweit so gut ich füge so dem Rezept eine Beilage hinzu (in der h. habe ich jeweils ein Objekt von Rezepte bzw beilagen erzeugt):

    PHP-Quellcode

    1. -(void)saveCoreDataBeilage:(NSString *)name :(NSString *)zutaten
    2. {
    3. NSError *error = nil;
    4. NSLog(@"name = %@",name);
    5. NSLog(@"zutaten = %@",zutaten);
    6. beilage.name = name;
    7. beilage.zutaten = zutaten;
    8. relationship = [NSMutableSet setWithObject:beilage]; //relationship = NSMutableSet
    9. [rezepte setBeilage:relationship];
    10. if(![self.managedObjectContext save:&error])
    11. {
    12. NSLog(@"Error = %@", error);
    13. }
    14. }
    Alles anzeigen


    name und zutaten bekomme ich aus einem Array übergeben und stimmen auch zu diesem Zeitpunk !Daher die Ausgabe
    der Aufruf ist hier:

    Quellcode

    1. for(int i = 0; i < beilageTiteArray.count; i++)
    2. {
    3. UITextField *NameTempBeilage = [beilageTiteArray objectAtIndex:i];
    4. UITextField *ZutatenTempBeilage = [beilageZutatenArray objectAtIndex:i];
    5. if(NameTempBeilage.text == nil)
    6. {
    7. NSLog(@"beilage unvoll ständig");
    8. }
    9. else
    10. {
    11. [self saveCoreDataBeilage:NameTempBeilage.text :ZutatenTempBeilage.text];
    12. }
    13. }
    Alles anzeigen




    Ich habe mal aus spaß in der saveCoreDataBeilage relationship bei jeden Aufruf in ein Array gespeichert und ausgegeben und das verblüffende ist das der Eintrag erst unterschiedlich war und dann war er gleich ein Beispiel:
    Waren die beilagen Namen so:

    Beilage1
    Beilage2
    Beilage2


    War die Ausgabe so:
    Array = ({Beilage1})
    Array = ({Beilage2, Beilage2})

    Array = ({Beilage3, Beilage3, Beilage3})



    Es war ein MutableArray also hab ich es immer mit [array addObject:relationship];
    Was mach ich in diesem Punkt falsch?


    Etwas weiteres merkwürdiges:
    Ich lass mir das Ganze dann so Ausgeben (bleiben wie bei dem Beispiel mit Beilage 1....):

    Quellcode

    1. for(Rezepte *rezepteInFor in rezepteArray)
    2. {
    3. NSLog(@"_____________________________________");
    4. NSLog(@"rezepte %@", rezepteInFor);
    5. for(Beilage *beilageInFor in [rezepteInFor.beilage allObjects])
    6. {
    7. NSLog(@"beilage name = %@",beilageInFor.name);
    8. }
    9. }
    Alles anzeigen


    ausgabe:

    Quellcode

    1. _____________________________________
    2. rezepte <Rezepte: 0x1a43d0> (entity: Rezepte; id: 0x19efe0 <x-coredata://ACF9CE58-8F65-48AE-998D-0CB66F437FB3/Rezepte/p3> ; data: {
    3. beilage = "<relationship fault: 0x1f6e70 'beilage'>";
    4. media = nil;
    5. name = "Mein ausgesuchter Name des Rezeptes;
    6. Zubereitung = "die Zubereitung meines Rezeptes";
    7. zutaten = "die Zutaten Meines Rezepte";
    8. })
    9. beilage name = Beilage 3
    Alles anzeigen

    Warum wird nur der LETZTE Eintrag ausgegeben und nicht alle? es ist doch eine ??

    So das sind meine Fragen ich hoffe ihr könnt mir helfen :)

    Eine hab ich noch so neben bei: gibt es eine Speech to Text Lib von Apple bzw eine nicht kommerzielle?

    Danke schonmal im Voraus
    Liebe Grüße

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von yannig7 ()

  • yannig7 schrieb:

    So wie ihr jetzt hoffentlich sieht hab ich eine one to many Verbindung von Rezepte zu Beilagen.

    Jo. Warum?
    Kann jede Beilage nur zu einem einzigen Rezept gehören? :P

    yannig7 schrieb:

    (in der h. habe ich jeweils ein Objekt von Rezepte bzw beilagen erzeugt):

    Das glaube ich nicht. Vermutlich hast du in der .h die jeweiligen Objekte deklariert und in der richtigen Methode deines AppDelegates die Instanzen erzeugt.

    Übrigens ist die Methodensignatur unglücklich gewählt.
    Statt -saveCoreDataBeilage:: solltest du das lieber -beilageMitNamen:zutatenname: nennen (und das fertige Managed Object zurück geben... egal.).

    yannig7 schrieb:

    Was mach ich in diesem Punkt falsch?

    Denken. ;)
    Du überschreibst permanent den Zeiger auf das NSMutableSet * relationship mit einem neuen Set, welches nur einen String hat.
    Dann fügst du diesen Zeiger deinem Array hinzu.

    Also:
    0x0986 Set
    0x0990 String im Set
    0x1234 Array
    0x1238 Zeiger auf 0x0986
    0x1242 Zeiger auf 0x0986
    0x1246 Zeiger auf 0x0986

    Und wenn du jetzt irgend ein Objekt des Arrays zurückverfolgst, landest du am Ende bei 0x0986->0x0990->String im Set. Immer.

    Das Programm macht also genau das, was du ihm sagst - was du ihm sagst ist nur nicht das, was du willst. ;)

    yannig7 schrieb:

    Warum wird nur der LETZTE Eintrag ausgegeben und nicht alle? es ist doch eine ??

    Naja, du setzt ja jedes Mal ein neues NSSet mit einem einzigen String. Wo sollen denn da mehr als der eine Eintrag herkommen?

    Speech-To-Text-Lib: keine Ahnung.
    Da solltest du dich aber echt noch lange nicht ran wagen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P