Propertyを使ってプロパティにフェッチ結果を持たせる。Propertyを使ってプロパティにフェッチ結果を持たせる。Property(フェッチドプロパティ)について説明する。フェッチドプロパティとは、フェッチ結果のオブジェクトを保持するプロパティである。Properties」(下図赤枠)でこの機能を実装する。作家と作家の出版物を管理する場合で考えよう。プロパティを持たせる。外部ファイルに多くの著者の書籍データがあり、その中から杉田真の書籍データをフェッチして出版物プロパティに配列で持たせる。これがフェッチドプロパティである。フェッチドプロパティを試す実際にフェッチドプロパティを試してみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる人はご利用されたし。事前準備では、著者情報を表示する画面と、書籍データを追加削除する画面を作っておいた。「出版物読み込み」ボタンを押したらフェッチドプロパティを利用して書籍一覧が表示されるものをこれから実装する。以下はViewController.swiftの変更前のソースコード。アプリ起動直後に著者の名前、性別、年齢を画面に表示している。//管理オブジェクトコンテキストを取得する。//検証用データを保存する。//著者情報を表示する。//著者オブジェクトの件数を取得する。//検証用の著者データを保存する。//管理オブジェクトコンテキストの中身を保存する。//オブジェクトを取得する。//ラベルに著者情報を設定する。{super.viewDidLoad()//管理オブジェクトコンテキストを取得する。applicationDelegate.managedObjectContext//検証用データを保存する。insertData()//著者情報を表示する。{//著者オブジェクトの件数を取得する。0){//検証用の著者データを保存する。//年齢}//管理オブジェクトコンテキストの中身を保存する。{//オブジェクトを取得する。[Author]//ラベルに著者情報を設定する。{}}まずはモデルにフェッチドプロパティを定義しよう。下図赤枠の「プロジェクト名.xcdatamodeld」を選択、黄緑枠のAuthorエンティティを選択する。紫枠の「+」ボタンを押してフェッチドプロパティの行を追加する。$FETCH_SOURCE.name」を入力する。これは「Bookエンティティのオブジェクトたちの中から、著者名と名前が一致するものをフェッチする」という条件設定である。ViewController.swiftの「出版物読込ボタン押下時の呼び出しメソッド」を以下のコードに変更する。出版物(フェッチドプロパティ)からフェッチ結果の配列を取り出し、テキストビューに一覧表示している。//著者オブジェクトから出版物を取得する。//書籍をテキストビューに設定する。{//著者オブジェクトから出版物を取得する。[Book]//書籍をテキストビューに設定する。str}以下が実際のプレイ動画。「出版物読み込み」ボタンを押す度に、保存されているデータの中から杉田真の書籍のみが検索されていることが分かる。NSArray型で取得した場合1つ興味深い仕様がある。「出版物読込ボタン押下時の呼び出しメソッド」を以下のコードに変更して実行してみてほしい。出版物の配列を取得するときにNSArray型にキャストして取得するようにした。//著者オブジェクトから出版物を取得する。//書籍をテキストビューに設定する。{//著者オブジェクトから出版物を取得する。NSArray//書籍をテキストビューに設定する。み」ボタンを押すと、保存されているデータの中から杉田真の書籍のみが検索されるのは先ほどと同じだが、それ以降はボタンを押しても1回目と同じデータしか取得できない。これは、フェッチプロパティをNSArray型で取得すると、オブジェクト内部でNSArray型のフェッチ結果が保持される仕様のためである。以下のコードでオブジェクトをリフレッシュすれば毎回最新の検索結果を取得できる。Swift//著者オブジェクトをリフレッシュする。false)123//著者オブジェクトをリフレッシュする。false)また、著者オブジェクトがどこからも参照されなくなってメモリから解放されたとき、フェッチ結果もクリアされる。フェッチドプロパティを未来のデータ変更の影響を受けない、その時点のフェッチ結果を保持するプロパティとして使うことはできない。エンティティを継承させて属性のメンテナンスをしやすくする。Relationshipでエンティティ間に関係を持たせる。エディタスタイル「Graph」でデータモデルを作る。エンティティごとに出力先の外部ファイルを変える。異なる管理オブジェクトコンテキストで保存したデータをリレーションシップに設定する。コメントをキャンセルメールアドレスが公開されることはありません。