【SwiftUI】Core Dataの使い方:検索編(1/3)

データベースを検索して、オブジェクトとして取得するfetch処理について解説します。
【SwiftUI】Core Dataの使い方:基本編を先に見ておくことをおすすめします。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】12.4
【Swift】5.3.2
【iOS】14.4
【macOS】Big Sur バージョン 11.1
スポンサーリンク

データの準備

検索対象として、次のような初期データのStudentテーブルを用意します。

初期データ

エンティティの定義は次の通り

エンティティの定義

次の初期データの登録処理(RegistSampleData.swift)をプロジェクトに追加します。

スポンサーリンク

検索処理のサンプルコード

テーブルを検索して表示する部分(ContentView.swift)は、次のようにします。

コードの強調部分がデータの検索結果をプロパティに紐付ける定義です。
以降の章では、この定義について解説します。

実行結果

Image003

スポンサーリンク

データ取得処理

SwiftUIではデータベースの検索結果とViewを同期する為の大変便利な仕組みとしてプロパティラッパー(@FetchRequest)が用意されています。
@FetchRequestを使ってプロパティを宣言すると、プロパティに検索結果が格納されるとともに、データの変更に応じて検索結果が常に最新に保たれます。
このプロパティを使ってViewを生成すると、データの変更がViewに即時反映される仕組みです。

@FetchRequest(…) の部分がプロパティラッパーの定義、private var students… 以降がプロパティの宣言です。

@FetchRequestの引数

@FetchRequestに指定可能な引数は次の通りです。

entity
検索対象entityを"エンティティ名.entity()"で指定します。

sortDescriptors
検索結果のソート順をNSSortDescriptorの配列で指定します。
トート順の指定を省略するには空の配列を渡します。

predicate(省略可)
検索結果の抽出条件を指定します。
省略した場合は、nil(抽出条件無し=全て)がデフォルト値として使用されます。

animation(省略可)
フェッチされた結果への変更に使用されるアニメーション効果をAnimation構造体で指定します。
省略した場合は、nil(アニメーション無し)がデフォルト値として使用されます。
Animation構造体については、を参照して下さい。
例のように.defaultを指定すると、標準のアニメーションが適用されます。

スポンサーリンク

ソート順の指定

検索結果のソート順は、NSSortDescriptorクラスを使用して指定します。
引数keyPathで並べ替える属性を、引数ascendingで昇順(true)か降順(false)を指定します。

例えば生徒の名前を昇順にソートするには、次のようにします。

ソート順の指定は複数重ねられます。
次は、クラス名+生年月日でソートした例です。

ちなみに対象属性は次のようにkeyPathに代わりに、引数keyを使って文字列で属性名を指定可能です。しかし、KeyPathを使う方が、予測入力やBuild時のチェックが機能するのでより安全です。

スポンサーリンク

抽出条件の指定

抽出条件は、NSPredicateクラスを使用して指定します。

次はAクラスの生徒のみ抽出する例です。

データに引用符が含まれていると複雑になるので、代わりに次のような構文を使用するのが一般的です。
%@ は「ここに文字列を挿入する」という意味で、そのデータをインラインではなくパラメータとして提供することができます。

抽出条件のバリエーション

抽出条件の指定方法を他にもいくつか紹介します。

名前が"カ"から始まる生徒を抽出

名前が"アライグマ"か"ハクビシン"のいずれかに一致する生徒を抽出

欠席日数が0日の生徒を抽出
※整数を挿入するときは%dを使います。

欠席日数が5日以上の生徒を抽出

NSPredicateは他にも多くの記述方法がありますが、こちらのサイトが参考になります。

【Swift】Core Dataの使い方。フェッチリクエストで取得するデータを絞り込む(Swift 2.1、XCode 7.2) | はじはじアプリ体験メモ
NSFetchRequestとは 本記事では、Core Dataの機能のNSFetchRequest(以下、フェッチリクエスト)について説明する。 フェッチリクエストとは、Core...
スポンサーリンク

あわせて読みたい記事

【SwiftUI】Core Dataの使い方:標準テンプレートを読み解く
(2023/03/25 更新) SwiftUIでのCore Dataの使い方を、標準テンプレートを読み解きながら解説します。
【SwiftUI】Core Dataの使い方:エンティエィ(Entity)を定義する
(2021/04/26 更新) Xcodeでエンティティを定義する方法を解説します。
【SwiftUI】Core Dataの使い方:準備編
SwiftUIでCore Dataを扱うための前提知識と、新規プロジェクトの作成方法について解説します。
【SwiftUI】Core Dataの使い方:基本編
SwiftUIでCore Dataの基本的な使い方を簡単なTodoリストアプリを例に解説します。
【SwiftUI】Core Dataの使い方:検索編(2/3)
検索条件を動的に変更する方法を解説します。 の続編です。
【SwiftUI】Core Dataの使い方:検索編(3/3)
前の2つの記事 では、SwiftUIの特徴であるデータバインディングの仕組みを使い、検索結果とViewを紐付ける方法を紹介しました。これにより、検索結果に応じてViewが自動で再描画されます。 しかし、検索結果を別の処理のインプットに使う場...
【SwiftUI】Core Dataの使い方:リレーションシップ編
リレーションシップを使ってエンティティ同士をリンクする方法を解説します。