Problem beim hinzufügen von neuen Objekten mit Core Data

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

  • Problem beim hinzufügen von neuen Objekten mit Core Data

    Hallo zusammen,

    nachdem mir die englisch-sprachigen Boards irgendwie nicht weiterhelfen können oder ich es einfach nicht verstehe, versuch ich es mal hier.

    Wie gesagt habe ich ein Problem mit CoreData. Zu allererst, ich habe meine App auf Basis des CoreDataBooks Beispiels von Apple gebaut.

    Ich habe eine Liste von Hotelgästen (GuestInfo) die jeweils in einem Zimmer (RoomInfo) sind und gewisse Vorlieben (PreferenceInfo) haben. GuestInfo hat ein Attribute name und 2 Relationships zu RoomInfo und PreferenceInfo. Jeder Gast kann nur in einem Zimmer sein, allerdings können mehrere Gäste ein Zimmer belegen. Jeder Gast hat keine oder mehrere Vorlieben. Die RoomInfo und PreferenceInfo listen werden von einer anderen Instance bearbeitet.

    So nun zum Problem. Wenn ich einen neuen Gast hinzufüge und NUR den Namen angebe, klappt alles. Auch wenn ich den Gast danach bearbeite und dann erst das Zimmer auswähle bzw die Vorlieben, klappt alles wie erwartet. Wenn ich allerding direkt beim hinzufügen Zimmer und Vorlieben eintragen will bekomme ich folgenden Fehler :

    Illegal attempt to establish a relationship 'room' between objects in different contexts


    Das ganze passiert bei folgender Zeile :

    Quellcode

    1. [editedObject setValue:selectedRoom forKey:editedFieldKey];


    hier noch der Header damit alle wissen was was ist :

    Quellcode

    1. NSManagedObject *editedObject;
    2. NSString *editedFieldKey;
    3. NSString *editedFieldName;


    Und hier meine Methode wie ich das zum Hinzufügen vorbereite :

    Quellcode

    1. - (IBAction)addNewItem
    2. {
    3. AddViewController *addViewController = [[AddViewController alloc] initWithStyle:UITableViewStyleGrouped];
    4. addViewController.delegate = self;
    5. addViewController.context = _context;
    6. // Create a new managed object context for the new book -- set its persistent store coordinator to the same as that from the fetched results controller's context.
    7. NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
    8. self.addingManagedObjectContext = addingContext;
    9. [addingContext release];
    10. [addingManagedObjectContext setPersistentStoreCoordinator:[[_fetchedResultsController managedObjectContext] persistentStoreCoordinator]];
    11. GuestInfo *info = (GuestInfo *)[NSEntityDescription insertNewObjectForEntityForName:@"GuestInfo" inManagedObjectContext:addingContext];
    12. addViewController.info = info;
    13. UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addViewController];
    14. [self.navigationController presentModalViewController:navController animated:YES];
    15. [addViewController release];
    16. [navController release];
    17. }
    Alles anzeigen


    Also, ich weis das es irgendein Problem mit dem Context gibt, denn wenn ich statt addingContext den _context benutze, geht zwar das eintragen, aber damit umgehe ich den seperaten Context und muss im Fall vom Abbruch des Nutzers das neu erstellte selber wieder löschen. --> Hier weis ich auch leider nicht wie ich das angehen soll.

    Ich hoffe jemand hat eine Idee, denn daran verzweifel ich langsam.

    Danke
  • Du kannst keine Beziehung zwischen Objekten verschiedener Kontexte setzen. Daher musst du das Objekt aus dem einen Kontext in den anderen kopieren.

    Die Motivation für den zweiten Kontext ist bei dir offenkundig, dass du ein Zwischenobjekt erzeugst, welches bei Caqcel wieder verworfen wird. Es gibt hier zwei alternative Lösungsmöglichkeiten: a) als Zwischenspeicher ein Dictionary verwenden, b) gleich das Objekt erzeugen und es den Nutzer unmodal zusammenbauen lassen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Nein so ist es "diesmal" nicht. Ich denke nur das ich es mit der Variante versuche das Object nicht im addingContext zu erstellen, also im _context und dann wenn jem,and cancel drückt das Teil manuell wieder wegzuräumen. Dazu hatte ich bisher keine Idee wie ich das überhaupt angehen soll, aber allein die Erwähnung von "Dictionary" hat mich auf eine Idee gebracht die ich mal ausprobieren will (nicht das ich ne fertige Lösung hätte). Falls jemand hierzu noch ne Idee/Lösung hat bin ich ganz Ohr.