尝试通过关系保存核心数据对象时出现致命错误
Fatal Error When Trying To Save Core Data Objects Via Relationship
我正在通过保存命令将新创建的用户练习添加到现有用户例程中。为了解释下面的代码,我设置了 objectcontext,然后是新的练习(userExercise 为 nil)我执行了一个新的保存块。
然后我检查这个新练习是否被添加到现有例程中(associatedRoutineToAddTo 是来自先前 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)
当您制作 UserExcercise 时,您引用的是保存在 VC:
上的上下文
let newUserExercise = UserExercise(context: self.managedObjectContext!)
然后
let existingUserRoutine = UserRoutine(context: managedObjectContext)
getMainContext()
在此处获取上下文?
您在此处创建对象:
let newUserExercise = UserExercise(context: self.managedObjectContext!)
并在此处获取相关对象:
let existingUserRoutine = UserRoutine(context: managedObjectContext)
您在此处创建了一个名为 managedObjectContext
的局部变量:
let managedObjectContext = getMainContext()
你的错误状态是:
attempt to establish a relationship 'usersroutine' between objects in different contexts
因此,您的属性managedObjectContext
与getMainContext()
返回的不一样
除此之外,您正在创建一个全新的 UserRoutine
,并将其分配给一个名为 existingRoutine
的值,然后创建一个您不对其执行任何操作的提取请求,这表明您对此处应该发生的事情有些困惑。
我正在通过保存命令将新创建的用户练习添加到现有用户例程中。为了解释下面的代码,我设置了 objectcontext,然后是新的练习(userExercise 为 nil)我执行了一个新的保存块。
然后我检查这个新练习是否被添加到现有例程中(associatedRoutineToAddTo 是来自先前 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)
当您制作 UserExcercise 时,您引用的是保存在 VC:
上的上下文 let newUserExercise = UserExercise(context: self.managedObjectContext!)
然后
let existingUserRoutine = UserRoutine(context: managedObjectContext)
getMainContext()
在此处获取上下文?
您在此处创建对象:
let newUserExercise = UserExercise(context: self.managedObjectContext!)
并在此处获取相关对象:
let existingUserRoutine = UserRoutine(context: managedObjectContext)
您在此处创建了一个名为 managedObjectContext
的局部变量:
let managedObjectContext = getMainContext()
你的错误状态是:
attempt to establish a relationship 'usersroutine' between objects in different contexts
因此,您的属性managedObjectContext
与getMainContext()
除此之外,您正在创建一个全新的 UserRoutine
,并将其分配给一个名为 existingRoutine
的值,然后创建一个您不对其执行任何操作的提取请求,这表明您对此处应该发生的事情有些困惑。