編集データを外部ファイルに保存する。これを使えば大量データも怖くない。編集データを外部ファイルに保存する。これを使えば大量データも怖くない。Dataについて説明する。Dataとは、アプリで入力または編集したデータを外部ファイルに保存する機能である。Dataを使うのが適している。⇒「NSUserDefaultとは」データ保存の大まかなイメージを下図で説明すると、まずアプリで入力または編集したデータをオブジェクトとして管理オブジェクトコンテキストという入れ物に入れる。一通り入れ終わったら、管理オブジェクトコンテキストに対して保存要求を行う。すると、オブジェクトの構造が定義されているモデルを使って形式が変換され、外部ファイルに出力される。これが保存の流れになる。逆の外部ファイルのデータを読み込む流れは、管理オブジェクトコンテキストに対してデータ取得要求を行うと、モデルを通して必要なデータのみが管理オブジェクトコンテキストに読み込まれ、それをアプリが参照する。Dataの良いところだ。Dataを使った簡単なプログラムを実装してみよう。Data」にチェックを入れる。チェックを入れなくても使うことはできるが、チェックを入れると使うための下準備をしてくれる。Dataを使おうとしている人でプロジェクトの作り方を知らない人はいないと思うが、念のためプロジェクトの作り方は次の記事を参照されたし。Data」のチェック有無で作られるファイルの違いを比較したもの。チェック有りの方は「プロジェクト名.xcdatamodeld」ファイルが最初から存在する。これは、先ほど説明したモデルを定義するためのファイルである。Dataを使うためのプロパティとメソッドが追記されている。ラベル(下図赤枠)とテキストフィールド(青枠)をデバイス画面に配置する。黄緑枠のアシスタントエディタボタンを押してViewController.swiftを開く。Ctrlキーを押しながらラベルをドラッグ&ドロップでソースコードまで運んで吹き出しの設定画面を表示させる。Connectionに「Outlet」、Nameに「testLabel」を入力して、Connectボタンを押す。同じようにしてテキストフィールドの吹き出しの設定画面を表示させ、Connectionに「Outlet」、Nameに「testTextField」を入力して、Connectボタンを押す。これでラベルとテキストフィールドをソースコードから操作できるようになった。Dataを使わない実装から。ViewController.swiftを以下のコードに変更する。Returnキーを押すと、テキストフィールドに入力した文字列をラベルに追記するようにした。//デリゲート先に自分を設定する。//ラベルの値にテキストフィールドの値を追記する。{super.viewDidLoad()//デリゲート先に自分を設定する。{//ラベルの値にテキストフィールドの値を追記する。true}}以下は実際のプレイ動画。データの保存や読込みをしてないのでアプリを再起動するとラベルの文字列が初期値に戻る。モデルの定義から始める。下図赤枠の「プロジェクト名.xcdatamodeld」を選択すると右側にモデルに定義されているエンティティが表示される。エンティティとは、オブジェクトが持つプロパティや関係が記載されている定義書のことで、管理オブジェクトコンテキストに格納するオブジェクト1つにつき1つのエンティティが割り当たる。Dataはモデルに記載されているエンティティを用いてオブジェクトから外部ファイルへ、外部ファイルからオブジェクトへの形式変換をしているのだ。いってもまだエンティティを作っていないので、エンティティは何もない。Entityボタンを押すと、紫枠のEntityが追加される。紫枠のEntityを選択、水色枠のデータモデルインスペクタボタンを押して設定画面を表示し、Nameに「Player」を入力する。これはソースコードからエンティティにアクセスするための識別子になる。続けて、下図赤枠の「+」ボタンを押してAttributesの行を追加し、Attributeに「name」、Typeに「String」を入力する。これでPlayerの持つ属性に名前と年齢が追加された。ViewController.swiftを以下のコードに変更する。viewDidLoadメソッドで、管理オブジェクトコンテキストからすべてのPlayerエンティティを取得し、ラベルに名前を列挙している。デリゲートメソッドの「Returnキー押下時の呼び出しメソッド」では、新しいPlayerエンティティを管理オブジェクトコンテキストに格納したあと、外部ファイルへの保存要求(saveメソッド)を行っている。//管理オブジェクトコンテキストを取得する。//管理オブジェクトコンテキストからPlayerエンティティを取得する。//すべてのPlayerエンティティの名前をラベルに表示する。//デリゲート先に自分を設定する。//ラベルの値にテキストフィールドの値を追記する。//新しいPlayerエンティティを管理オブジェクトコンテキストに格納する。//Playerエンティティの名前にテキストフィールドの値を設定する。//管理オブジェクトコンテキストの中身を永続化する。{//管理オブジェクトコンテキストを取得する。applicationDelegate.managedObjectContext//管理オブジェクトコンテキストからPlayerエンティティを取得する。[NSManagedObject]//すべてのPlayerエンティティの名前をラベルに表示する。String(data.valueForKey("name")!)}//デリゲート先に自分を設定する。{//ラベルの値にテキストフィールドの値を追記する。testTextField.text!//新しいPlayerエンティティを管理オブジェクトコンテキストに格納する。managedContext)//Playerエンティティの名前にテキストフィールドの値を設定する。forKey:"name")//管理オブジェクトコンテキストの中身を永続化する。true}}以下は実際のプレイ動画。Dataを使って保存したデータが再起動時にラベルに表示されるようになった。Dataの話を続ける。Propertyの条件式の書き方。エンティティの属性の型、範囲、初期値を設定する。保存データの更新、削除、ロールバックを行う。フェッチの件数制限、並び替え、開始位置を指定する。カスタムクラスを作ってエンティティの属性へのアクセスを簡潔にする。本記事は、前回記事「Entityの設定」の続きである。コメントをキャンセルメールアドレスが公開されることはありません。