2017-01-27 4 views
0

Ich füge eine neue Benutzerübung zu einer vorhandenen Benutzerroutine über einen Speicherbefehl hinzu. Um den folgenden Code zu erklären, setze ich den Objektkontext, dann ist die Übung neu (userExercise ist null) Ich führe einen neuen Speicherblock aus.Schwerwiegender Fehler beim Versuch, Kerndatenobjekte über die Beziehung zu speichern

Ich überprüfe dann, ob diese neue Übung zu einer bestehenden Routine hinzugefügt wird (associatedRoutineToAddTo ist ein String-Routine-Name von der vorherigen VC).

Hier ist das Problem. Ich versuche, das UserRoutine-Objekt zu erhalten, zu dem es hinzugefügt werden muss, indem ich ein Prädikat verwende, das auf dem Namen der Routinen aus der Zeichenfolge basiert, die ich von der vorherigen VC übergeben habe. dann versuche ich, die Übung der Routine hinzuzufügen. Dies verursacht den Absturz.

Der Rest des Codes ist nicht zu relevant, da es in Bezug auf das Speichern einer Bearbeitung oder einer neuen Übung mit keiner Elternroutine gut funktioniert, es ist nur dieser eine Teil.

Hier ist, was ich versuche:

func getMainContext() -> NSManagedObjectContext { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    return appDelegate.persistentContainer.viewContext 
} 

func createExercise() { 
    print("SAVE EXERCISE PRESSED") 
    let managedObjectContext = getMainContext() 

    if userExercise == nil { 
     print("SAVING THE NEW EXERCISE") 
     let newUserExercise = UserExercise(context: self.managedObjectContext!) 
     newUserExercise.name = userExerciseName.text 
     newUserExercise.sets = Int64(userSetsCount) 
     newUserExercise.reps = Int64(userRepsCount) 
     newUserExercise.weight = Double(self.userExerciseWeight.text!)! 
     newUserExercise.dateCreated = NSDate() 

     if self.associatedRoutineToAddTo != nil { 

      let existingUserRoutine = UserRoutine(context: managedObjectContext) 
      let request: NSFetchRequest<UserExercise> = UserExercise.fetchRequest() 
      request.predicate = NSPredicate(format: "usersroutine.name == %@", self.associatedRoutineToAddTo!) 
      existingUserRoutine.addToUserexercises(newUserExercise) 

      do { 
       try managedObjectContext.save() 
      } catch { 
       fatalError("Failure to save context: \(error)") 
      } 

     } else if self.associatedRoutineToAddTo == nil { 
      print("THIS IS A FRESH EXERCISE WITHOUT A PARENT ROUTINE") 
     } 
    } 

Der Fehler lautet:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'usersroutine' between objects in different contexts (source = <UserExercise: 0x618000280e60> 

edit: mein holen Code für die Überprüfung überarbeitet: Sie

 let fetchRequest: NSFetchRequest<UserRoutine> = UserRoutine.fetchRequest() 
     fetchRequest.predicate = NSPredicate(format: "usersroutine.name == %@", self.associatedRoutineToAddTo!) 

     do { 
      existingUserRoutine = try managedObjectContext.fetch(fetchRequest) as! UserRoutine 
      print("Routine Below Fetched") 
      print(existingUserRoutine) 
     } catch { 
      print("Fetch Failed") 
     } 

     existingUserRoutine.addToUserexercises(newUserExercise) 
+1

Bitte zeigen Sie das Crash-Protokoll und den Fehler, der ausgedruckt wird – jrturton

+0

Ich habe das OP – jwarris91

Antwort

2

Sie erstellen das Objekt hier:

let newUserExercise = UserExercise(context: self.managedObjectContext!)

Und holt das zugehörige Objekt hier:

let existingUserRoutine = UserRoutine(context: managedObjectContext)

Sie eine lokale Variable mit dem Namen erstellt haben managedObjectContext hier:

let managedObjectContext = getMainContext()

Und Ihre Fehlerzustände:

Versuch, eine Beziehung ‚usersroutine‘ zwischen Objekten in verschiedenen Kontexten

Daher Ihre Immobilie managedObjectContext zu etablieren ist nicht das gleiche wie die von getMainContext()

zurück

Zusätzlich zu all dem erstellen Sie ein brandneues UserRoutine und weisen es einem Wert namens existingRoutine zu, und erstellen dann eine Abrufanforderung, mit der Sie nichts anfangen h, was andeutet, dass du etwas verwirrt bist, was hier passieren soll.

+0

aktualisiert Ich habe das Selbst entfernt, so dass beide Kontexte sind managedObjectContext und das löst den Absturz, aber wie Sie gesagt, es scheint nur ein neues erstellen Routine. Ich bin etwas verwirrt, da ich keine Kerndaten habe. Wie würde ich die Übung erfolgreich der Routine hinzufügen und die vorhandene Routine statt einer neuen Routine speichern? Schätzen Sie den Rat – jwarris91

+0

Anstatt eine neue Routine zu erstellen, führen Sie die Fetch-Anfrage und verwenden Sie das Ergebnis – jrturton

+0

Ich fügte den geänderten Code an der Unterseite meines OP, ich weiß es nicht 100%, wie ich Fehler habe, aber ist diese Logik korrekt? die Benutzerroutinen auf der Grundlage des Prädikats des vorhandenen Routinenamens anfordern, dann dieses Ergebnis als die existierende Routine setzen und die Benutzerübung zu der Routine hinzufügen? – jwarris91

0

, wenn Sie machen UserExcercise beziehen sich auf einen Kontext, der auf Ihrem VC gespeichert wurde:

let newUserExercise = UserExercise(context: self.managedObjectContext!) 

Dann

 let existingUserRoutine = UserRoutine(context: managedObjectContext) 

Die hier getMainContext() acquire Kontext?

Verwandte Themen