尝试通过关系保存核心数据对象时出现致命错误

时间:2017-01-27 13:51:29

标签: ios swift core-data nsmanagedobjectcontext

我通过save命令将新创建的用户练习添加到现有用户例程。为了解释下面的代码,我设置了objectcontext,然后练习是新的(userExercise是nil)我执行一个新的保存块。

然后我检查是否将这个新练习添加到现有例程中(associatedRoutineToAddTo是来自前一个VC的字符串例程名称)。

这就是问题所在。我尝试使用基于我从前一个VC传递的字符串中的例程名称的谓词来获取需要添加的UserRoutine对象。然后我尝试将练习添加到例程中。这会导致崩溃。

其余代码不太相关,因为它在保存编辑或没有父例程的新练习方面工作正常,它只是这一部分。

以下是我的尝试:

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)

2 个答案:

答案 0 :(得分:2)

您可以在此处创建对象:

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

在此处获取相关对象:

let existingUserRoutine = UserRoutine(context: managedObjectContext)

您已在此处创建了一个名为managedObjectContext的本地变量:

let managedObjectContext = getMainContext()

您的错误说明:

  

尝试建立关系&#39; usersroutine&#39;在不同上下文中的对象之间

因此,您的媒体资源managedObjectContextgetMainContext()

返回的资源不同

除此之外,您还要创建一个全新的UserRoutine,并将其分配给名为existingRoutine的值,然后创建一个您不做的抓取请求任何事情,这表明你对这里应该发生的事情感到有点困惑。

答案 1 :(得分:0)

当您使用UserExcercise时,您正在引用VC上保存的上下文:

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

然后

        let existingUserRoutine = UserRoutine(context: managedObjectContext)

getMainContext()获取上下文?