Я добавляю только что созданное пользовательское упражнение к существующей пользовательской процедуре с помощью команды save. Чтобы объяснить приведенный ниже код, я устанавливаю objectcontext, тогда это упражнение новое (userExercise is nil) Я выполняю новый блок сохранения.Неустранимая ошибка при попытке сохранить основные объекты данных через связь
Затем я проверяю, добавлено ли это новое упражнение в существующую процедуру (связанныйRoutineToAddTo - это имя строковой подпрограммы из предыдущего VC).
Здесь проблема. Я пытаюсь получить объект UserRoutine, к которому он должен быть добавлен, используя предикат, основанный на имени подпрограмм, из строки, переданной из предыдущего VC. то я пытаюсь добавить упражнение к рутине. Это приводит к сбою.
Остальная часть кода не слишком уместна, так как она отлично работает с точки зрения сохранения редактирования или нового упражнения без родительской подпрограммы, а именно этой части.
Вот что я пытаюсь:
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")
}
}
Ошибка гласит:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'usersroutine' between objects in different contexts (source = <UserExercise: 0x618000280e60>
редактировать: пересмотренный мою выборку код для обзора:
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)
Просьба показать журнал сбоя и распечатку ошибки – jrturton
Я обновил OP – jwarris91