複数の管理オブジェクトコンテキストを使う。複数の管理オブジェクトコンテキストを使う。複数の管理オブジェクトコンテキストとは前回記事までは、1つの管理オブジェクトコンテキストを使用してデータを保存した。外部ファイルに保存するタイミングがすべてのオブジェクトで同じで良ければいいが、あるエンティティは即時保存し、その他のエンティティは登録ボタンを押した段階で保存するなどエンティティごとに保存するタイミングを分けたいことがある。そんなときは管理オブジェクトを2つ作り、管理オブジェクトコンテキストごとに保存するタイミングを変える。複数の管理オブジェクトコンテキストを利用してみる実際に、複数の管理オブジェクトコンテキストを利用してみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる人はご利用されたし。部活動と生徒を登録する画面があり、キーボードのReturnキーを押すと管理オブジェクトコンテキストにデータが追加される。その後、保存ボタンを押すと外部ファイルにデータが保存される。部活動と生徒のオブジェクトは同じ管理オブジェクトコンテキストに追加しているので、保存ボタンを押すと両方が保存される。これから、部活動用と生徒用の管理オブジェクトコンテキストを分けて、保存ボタンを押した側の管理オブジェクトコンテキストのみ保存されるように変更する。以下は変更前のプレイ動画AppDelegate.swiftを以下のコードに変更する。変更箇所は2つ目の管理オブジェクトコンテキストを作ったのと、アプリ終了時に保存されていないデータはそのまま保存しないようにした(青色箇所)。managedObjectContext}()}ViewController.swiftを以下のコードに変更する。生徒のデータは生徒用の管理オブジェクトコンテキストに追加するようにした。//部活動用と生徒用の管理オブジェクトコンテキストを取得する。//Clubオブジェクトをフェッチしてラベルに設定する。//Studentオブジェクトをフェッチしてラベルに設定する。//デリゲート先に自分を設定する。//キーボードをしまう。//Clubオブジェクトを取得する。//Clubオブジェクトが取得できた場合はそのオブジェクトを使い、取得できなかった場合は新規追加する。//属性値を変更する。//Studentオブジェクトを取得する。//Studentオブジェクトが取得できた場合はそのオブジェクトを使い、取得できなかった場合は新規追加する。//属性値を変更する。//管理オブジェクトコンテキストの中身を保存する。//管理オブジェクトコンテキストの中身を保存する。{//部活動用と生徒用の管理オブジェクトコンテキストを取得する。applicationDelegate.managedObjectContext2//Clubオブジェクトをフェッチしてラベルに設定する。club.teacher}//Studentオブジェクトをフェッチしてラベルに設定する。student.activity}//デリゲート先に自分を設定する。{//キーボードをしまう。{//Clubオブジェクトを取得する。[Club]//Clubオブジェクトが取得できた場合はそのオブジェクトを使い、取得できなかった場合は新規追加する。Club}//属性値を変更する。teacherTextField.text//Studentオブジェクトを取得する。[Student]//Studentオブジェクトが取得できた場合はそのオブジェクトを使い、取得できなかった場合は新規追加する。Student}//属性値を変更する。{//管理オブジェクトコンテキストの中身を保存する。{//管理オブジェクトコンテキストの中身を保存する。{print(error)}}}以下は実際のプレイ動画。部活動側の保存ボタンを押した場合は、部活動のデータのみ保存されるようになった。逆に、生徒側の保存ボタンを押した場合は生徒のデータのみ保存される。エンティティを継承させて属性のメンテナンスをしやすくする。