保存データの更新、削除、ロールバックを行う。保存データの更新、削除、ロールバックを行う。Dataを使って外部ファイルに新しいデータを追加する実装方法を説明してきた。本記事では、外部ファイルに保存したデータを更新、削除したり、外部ファイルに保存する前に取り消す実装方法について説明する。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる人はご利用されたし。Barに入力した文字列を含むデータを一覧表示するようにしておいた。「取り消しボタン」と「保存ボタン」の機能はまだ実装していない。//Bookエンティティの件数を取得する。//何も保存されていない場合は検証用データを保存する。//管理オブジェクトコンテキストの中身を保存する。//デリゲート先を自分に設定する。//何も入力されていなくてもReturnキーを押せるようにする。//管理オブジェクトコンテキストを取得する。//コンフリクトが発生した場合はマージする。//検証用データを格納する。//デリゲート先に自分を設定する。//セルのラベルに本のタイトルを設定する。//キーボードをしまう。//検索結果配列を作る。//テーブルを再読み込みする。//検索結果配列を空にする。//フェッチリクエストのインスタンスを生成する。//属性nameが検索文字列を含むデータをフェッチ対象にする。//フェッチリクエストを実行する。{//Bookエンティティの件数を取得する。0){//何も保存されていない場合は検証用データを保存する。//発売日}//管理オブジェクトコンテキストの中身を保存する。{super.viewDidLoad()//デリゲート先を自分に設定する。self//何も入力されていなくてもReturnキーを押せるようにする。false//管理オブジェクトコンテキストを取得する。applicationDelegate.managedObjectContext//コンフリクトが発生した場合はマージする。NSMergeByPropertyObjectTrumpMergePolicy//検証用データを格納する。insertBook()//デリゲート先に自分を設定する。{//セルを取得する。UITableViewCell//セルのラベルに本のタイトルを設定する。{//キーボードをしまう。testSearchBar.endEditing(true)//検索結果配列を作る。makeSearchResult()//テーブルを再読み込みする。{//検索結果配列を空にする。searchResult.removeAll()//フェッチリクエストのインスタンスを生成する。{//属性nameが検索文字列を含むデータをフェッチ対象にする。{//フェッチリクエストを実行する。{print(error)}}}保存データの取得と更新セルをタップすると雑誌の価格が100円増加するようにする。UIViewController.swiftに以下のメソッドを追加する。選択行の価格表示を更新したあと、管理オブジェクトコンテキストからオブジェクトを取得し、priceの値を更新している。この段階ではまだ外部ファイルに保存されていない。//検索結果配列を更新する。//テーブルの選択行を再読み込みする。//選択行のオブジェクトを管理オブジェクトコンテキストから取得する。//オブジェクトのpriceを更新する。{//検索結果配列を更新する。100//テーブルの選択行を再読み込みする。UITableViewRowAnimation.Fade)//選択行のオブジェクトを管理オブジェクトコンテキストから取得する。{//オブジェクトのpriceを更新する。{print(error)}}コミット、ロールバックViewController.swiftに以下のメソッドを追加する。「保存ボタン」では、管理オブジェクトコンテキストのsaveメソッドを呼び出して外部ファイルにデータを保存している。「取り消しボタン」では、rollbackメソッドを呼び出して管理オブジェクトコンテキストに格納されているオブジェクトを破棄している。//管理オブジェクトコンテキストの中身を保存する。//管理オブジェクトコンテキストの中身を保存する。//検索結果配列を作成する。//テーブルを再読み込みする。{//管理オブジェクトコンテキストの中身を保存する。{//管理オブジェクトコンテキストの中身を保存する。managedContext.rollback()//検索結果配列を作成する。makeSearchResult()//テーブルを再読み込みする。testTableView.reloadData()}以下は、この時点で実行したプレイ動画。保存ボタンで変更確定、取り消しボタンで表示が元に戻る。次に、セルをスワイプして削除する機能を実装する。ViewController.swiftを以下のコードに変更する。選択行をテーブルビューから削除したあと、選択行のオブジェクトを管理オブジェクトコンテキストから削除している。//すべての行を編集可能にする。//選択行のオブジェクトを管理オブジェクトコンテキストから取得する。//検索結果配列から選択行のオブジェクトを削除する。//テーブルビューから選択行を削除する。//管理オブジェクトコンテキストから選択行のオブジェクトを削除する。Bool{//すべての行を編集可能にする。{//選択行のオブジェクトを管理オブジェクトコンテキストから取得する。{//検索結果配列から選択行のオブジェクトを削除する。searchResult.removeAtIndex(indexPath.row)//テーブルビューから選択行を削除する。UITableViewRowAnimation.Fade)//管理オブジェクトコンテキストから選択行のオブジェクトを削除する。