2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

iOSAdvent Calendar 2023

Day 9

Derivedを使いこなしてCoreDataで高度な検索を行おう

Last updated at Posted at 2023-12-08

Core Dataを構成するファイル xcdatamodeld のプロパティに Derived というチェックマークが存在します。
そして、Derivedにチェックを入れると Derivation の入力窓が表示されます。
これを使いこなすとCore Data内に保存されているデータをいろんな形で取り出すことができますので、この使い方を説明します。

スクリーンショット 2023-12-03 18.34.07.png

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に与えることによって、ダイアクリティカルマークや大文字を無視したデータが表示できます。
Simulator Screenshot - iPhone 15 Pro - 2023-12-03 at 19.01.27.png

uppercase:

uppercase:(title) とDerivationに与えることによって、小文字を無視したデータが表示できます。
Simulator Screenshot - iPhone 15 Pro - 2023-12-03 at 19.04.32.png

lowercase:

lowercase:(title) とDerivationに与えることによって、大文字を無視したデータが表示できます。

Simulator Screenshot - iPhone 15 Pro - 2023-12-03 at 19.04.48.png

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では使えません。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?