Core Dataを構成するファイル xcdatamodeld のプロパティに Derived というチェックマークが存在します。
そして、Derivedにチェックを入れると Derivation
の入力窓が表示されます。
これを使いこなすとCore Data内に保存されているデータをいろんな形で取り出すことができますので、この使い方を説明します。
NSDerivedAttributeDescription
Derivedのチェックマークをつけることで生成できる NSDerivedAttributeDescription
は、他の属性から導出される属性を表現するために使用されます。
一つのAttributeは基本的には永続的に保存されたデータを保存していますが、Derivedのチェックマークをつけると、既存のAttributeから処理を与えて加工したデータなどをAttributeとして扱うことができます。
これを行うことで、柔軟なクエリで検索を行ったりが可能になります。
Derivedの利用
まずはCore Dataモデル上に適当なAttributeを作成します。
このプロパティの Derived
にチェックを入れます。
そして Derivation
に、与える処理の内容を記述します。
Derivation に与える内容
与えることができる内容は以下の公式ドキュメントに書いてあります。
https://developer.apple.com/documentation/coredata/nsderivedattributedescription
to-one keypath
他のAttributeやリレーションシップのデータを表現
他のAttributeや、Relationshipsにto-oneで登録しているmodelのAttributeをそのまま表示することができます。
例えば、Relationshipsにto-oneのbookモデルを持っていた場合、Derivationに book.text
と設定することによって直接Attributeとして扱うことが可能です。
to-one keypath with a function
主にString Attributeに対して効果を与えるものになります。
String Attributeのtitleには以下のデータが保存されているとします。
- é, è, ê, ë
- ñ
- â, ê, î, ô, û
- à, è, ì, ò, ù
- ö, ü
- AiUeO
canonical:
canonical:(title)
とDerivationに与えることによって、ダイアクリティカルマークや大文字を無視したデータが表示できます。
uppercase:
uppercase:(title)
とDerivationに与えることによって、小文字を無視したデータが表示できます。
lowercase:
lowercase:(title)
とDerivationに与えることによって、大文字を無視したデータが表示できます。
to-many keypath with a function
Relationshipsにto-many で登録しているmodelに対しての処理結果をAttributeとして持つことができます。
@count
例えば、entities というto-manyなRelationshipsを持っている場合、
entities.@count
とDerivationに設定することで、entitiesのモデル数をAttributeとして扱うことが可能になります。
@sum
例えば、entities というto-manyなRelationshipsを持っていて、そのモデルがpriceというDecimal typeのモデルを持っている時、
entities.price.@sum
とDerivationに設定することで、entitiesのpriceの合計をAttributeとして扱うことが可能になります。
time
now()
を使うことで、Attributeを現在時刻として扱うことができます。
まとめ
Derivedを使うことによって、一旦永続データからデータを取得した後にフィルタリングや計算していたような処理を、Attributeで実現することが可能になります。
使おう!Core Data!
ちなみに
SwiftDataでは使えません。