2017-01-27 9 views
0

私は、新しく作成されたユーザーエクササイズを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> 

編集を:あなたはUserExcerciseあなた作るとき

 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

エラーを表示してください。 – jrturton

+0

私はOP – jwarris91

答えて

2

あなたはここにオブジェクトを作成

:あなたがここに呼ばれるローカル変数managedObjectContextを作成しました

let existingUserRoutine = UserRoutine(context: managedObjectContext)

let managedObjectContext = getMainContext()

そして、あなたのエラー状態:異なるコンテキストで

をオブジェクト間の関係「usersroutine」を確立するため

試みはそのため、あなたの財産managedObjectContextgetMainContext()

で返されるものと同じではありません

これに加えて、新しいUserRoutineというブランドを作成し、それをexistingRoutineという値に割り当ててから、何もしないフェッチ要求を作成しますあなたがここで起こっていると思われることについて少し混乱していることを示唆しています。

+0

を更新しました。両方のコンテキストがmanagedObjectContextであり、クラッシュを解決するように自分自身を削除しましたが、ルーチン。私はコアデータで経験していない私はちょっと混乱しています。私はどのようにルーチンに運動を追加し、新しいルーチンではなく既存のルーチンを保存することに成功しますか?アドバイスをよろこぶ – jwarris91

+0

新しいルーチンを作成する代わりに、フェッチ要求を実行して結果を使用する – jrturton

+0

改訂コードをOPの一番下に追加しました。エラーはあるものの100%ではありませんが、正しいロジックですか?既存のルーチン名の述語に基づいてユーザールーチンを要求し、その結果を既存のルーチンとして設定し、ユーザーエクササイズをルーチンに追加しますか? – jwarris91

0

:私はレビューのためのコードをフェッチ改訂しましたあなたのVCに保存されているコンテキストを参照しています:

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

そして、ここ

 let existingUserRoutine = UserRoutine(context: managedObjectContext) 

getMainContext()取得コンテキスト?ここに関連するオブジェクトを

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

をフェッチ:

関連する問題