【Swift】Core Dataの設定。Fetched Propertyの条件式の書き方。(Swift 2.1、XCode 7.2)

2020年6月16日

Fetched Propertyの設定

本記事ではFetched Property(以下、フェッチドプロパティ)のデータモデルインスペクタの設定について説明する。

フェッチドプロパティの使い方については次の記事を参照されたし。⇒「記事

Fetched Propertyのデータモデルインスペクタ

 

フェッチドプロパティの設定画面を開くには、下図赤枠の「プロジェクト名.xcdatamodeld」を選択、黄緑枠のエンティティの中からフェッチドプロパティを持つエンティティを選択、水色枠内のフェッチドプロパティを選択、紫枠のデータモデルインスペクタボタンを押す。

Fetched Propertyの設定画面を開く

 

設定項目を1つずつ確認する。

Name

フェッチドプロパティの名前。ソースコードからフェッチドプロパティにアクセスするための識別子になる。

メニュー⇒「Editor」⇒「Create NSManagedObject Subclass」からサブクラスを作る場合、AttributeやRelationshipはプロパティが自動生成されるが、残念なことにフェッチドプロパティは自動生成されない(Swift 2.1、XCode 7.2)。

なので、前回記事では以下のメソッドを用いてフェッチドプロパティにアクセスした。

 

しかし、自動生成されないからといってサブクラスにプロパティを持たせることができないというわけではなく、以下コードのように、自分でフェッチドプロパティを追記すれば使えるようになる。

ただし、サブクラスを作り直すと追記したコードが消えるので、作り直すたびにフェッチドプロパティを追記することを忘れずに。

Destination

フェッチ先のエンティティを指定する。フェッチ元とフェッチ先のエンティティを同じにすることもできる。

 

Predicate

フェッチするときの条件式を記述する。

フェッチリクエストと同じ演算子が使える。ただし、プレースホルダーは使えない。⇒「フェッチリクエストの演算子

以下は記述例

■500円以上の本をフェッチする。
price >= 500
 
■200円から500円の本をフェッチする。
price BETWEEN {200,500}
 
■書籍名に「テスト」を含む本をフェッチする。
bookName CONTAINS “テスト"
 
■500円以上かつ書籍名に「テスト」を含む本をフェッチする。
bookName CONTAINS “テスト" AND price >= 500

 

下表はフェッチドプロパティに使用できる定数

定数 説明
$FETCH_SOURCE フェッチ元のオブジェクト
SELF フェッチ先のオブジェクト
$FETCHED_PROPERTY フェッチ元のフェッチプロパティ

■フェッチ先の著者名がフェッチ元の名前と同じものをフェッチする。
(書き方1)author == $FETCH_SOURCE.name
(書き方2)SELF.author == $FETCH_SOURCE.name
 
■フェッチ元とフェッチ先のオブジェクトが異なるものをフェッチする。
SELF != $FETCH_SOURCE

 

User Info

$FETCHED_PROPERTYはフェッチドプロパティそのものなので、このままでは比較しようがない。そこで、フェッチドプロパティのUser Infoに値を設定し、その値を比較する使い道が考えられる。⇒「User Infoとは

例えば下図のように、User Infoにkey「lowerLimit」、Value「300」の行を追加し、Predicateに「$FETCHED_PROPERTY.userInfo.lowerLimit」を入力する。このフェッチドプロパティは価格が300円以上の本をフェッチするということだ。

Fetched PropertyのUser Infoに値を設定

 

以下は実際のプレイ動画

 

ちなみに、ソースコードからフェッチドプロパティのUser Infoの値を取得したり、変更したりするには以下のようにする。