【Swift】Core Dataの設定。Fetched Propertyの条件式の書き方。(Swift 2.1、XCode 7.2)
Fetched Propertyの設定
本記事ではFetched Property(以下、フェッチドプロパティ)のデータモデルインスペクタの設定について説明する。
フェッチドプロパティの使い方については次の記事を参照されたし。⇒「記事」
フェッチドプロパティの設定画面を開くには、下図赤枠の「プロジェクト名.xcdatamodeld」を選択、黄緑枠のエンティティの中からフェッチドプロパティを持つエンティティを選択、水色枠内のフェッチドプロパティを選択、紫枠のデータモデルインスペクタボタンを押す。
設定項目を1つずつ確認する。
Name
フェッチドプロパティの名前。ソースコードからフェッチドプロパティにアクセスするための識別子になる。
メニュー⇒「Editor」⇒「Create NSManagedObject Subclass」からサブクラスを作る場合、AttributeやRelationshipはプロパティが自動生成されるが、残念なことにフェッチドプロパティは自動生成されない(Swift 2.1、XCode 7.2)。
なので、前回記事では以下のメソッドを用いてフェッチドプロパティにアクセスした。
1 2 3 |
//著者オブジェクトから出版物を取得する。 let bookArray = author.valueForKey("publication") as! [Book] |
しかし、自動生成されないからといってサブクラスにプロパティを持たせることができないというわけではなく、以下コードのように、自分でフェッチドプロパティを追記すれば使えるようになる。
ただし、サブクラスを作り直すと追記したコードが消えるので、作り直すたびにフェッチドプロパティを追記することを忘れずに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// // Author+CoreDataProperties.swift // import Foundation import CoreData extension Author { @NSManaged var name: String? @NSManaged var sex: NSNumber? @NSManaged var age: NSNumber? @NSManaged var publication: NSArray? //追記 } |
Destination
フェッチ先のエンティティを指定する。フェッチ元とフェッチ先のエンティティを同じにすることもできる。
Predicate
フェッチするときの条件式を記述する。
フェッチリクエストと同じ演算子が使える。ただし、プレースホルダーは使えない。⇒「フェッチリクエストの演算子」
以下は記述例
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円以上の本をフェッチするということだ。
以下は実際のプレイ動画
ちなみに、ソースコードからフェッチドプロパティのUser Infoの値を取得したり、変更したりするには以下のようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//Authorオブジェクトを取得する。 let fetchRequest = NSFetchRequest(entityName: "Author") let result = try managedContext.executeFetchRequest(fetchRequest) as? [Author] //publicationプロパティのDescriptionを取得する。 let description = result![0].entity.propertiesByName["publication"] //publicationプロパティのUser Infoに設定されているKey「lowerLimit」の値を設定する。 let value = description!.userInfo!["lowerLimit"] print(value) //Key「lowerLimit」の値を変更する。 description!.userInfo!["lowerLimit"] = 250 |