【SwiftUI】CoreData のデータ取得メソッドの実装【NSPredicateによる条件指定も解説】

この記事では、SwiftUIでのCoreData内のデータ取得メソッドの実装と、NSPredicateによる条件指定方法を解説します。

CoreData内のデータの取得方法で@FetchRequest(entity: Data.entity(), sortDescriptors: [NSSortDescriptor(key: "date", ascending: true)],animation: .spring()) var results : FetchedResults<Data> というように、FetchedResults<> 型の変数を定義して利用される事が多いですが、今回はデータ取得メソッドを作成する方法と、その際にNSPredicate による条件指定方法を紹介します。

 

ベースのコードとして、CoreData の基本的な実装方法【CRUD(作成、更新、削除)】を紹介している他の記事を参考にしています。

関連記事

この記事では、SwiftUIでのCoreData の基本的な実装方法【CRUD(作成、更新、削除)】を紹介しています。簡単なタスク管理App(タスク内容とスケジュールの登録)を作成しながら解説します。 ◆動[…]

【SwiftUI】CoreData の基本的な実装方法【CRUD(作成、更新、削除)】

 

◆動作検証環境

・ローカル環境:mac Catalina
・XCode:12.1
・SwiftUI:2.0
・iOS:14.0
・Life Cycle:SwiftUI App
スポンサードリンク

CoreDataの基本的な実装方法

 

まずは、CoreDataでのCRUD(作成、更新、削除)機能が可能なベースとなるファイルを作成し、コードを編集します。

 

以下の記事の方法を参考に準備を行います。

【SwiftUI】CoreData の基本的な実装方法【CRUD(作成、更新、削除)】

 

作成したプロジェクトを実行すると、以下のような簡単なToDo機能のアプリの動作を確認できます。

簡単なToDo機能のアプリ

 

優先度Attributeの追加

現在のTask EntityのAttributeはcontent,dateの2種類です。

Int型を検索条件として指定できるように、Int型priorityも追加します。

 

関係するファイルを編集します。

ContentView.swift

 

NewDataSheet.swift

 

ViewModel.swift

 

データ取得メソッドの実装方法

 

全件データ取得メソッド

以下のメソッドを作成します。

 

動作を確かめるために、FetchedResults<> 型の変数を使用していた所で、このメソッドを呼びます。

 

スポンサードリンク

並び順の指定

これで、同じように全件データが表示されますが、並び順の指定をしていなので、元の表示とは表示の仕方が変わります。

同じようにdateを条件にする場合は、NSSortDescriptor を使用して指定します。

これで、タスクの日付順に表示されるようになります。

 

条件をつけてデータを取得するメソッド

いくつかの条件を指定してデータを取得します。

下記のサンプルデータを利用して動作を確認します。

 

Int型データを条件として指定

Int型データを条件として指定例として、指定の優先度以上のデータのみ取得するように編集します。

 

getAllDataByPriority(priority: 2)

これで優先度2以上のデータのみ取得できます。

 

Date型データを条件として指定

 

getAllDataByDate(date: Date())

これで本日以降のデータのみ取得します。

 

String型データを条件として指定

 

getAllDataByContent(content: "買い物")

これで”買い物”に合致するデータのみ取得できます。

 

他にも

CONTAINS :指定の文字列が含まれるデータ

LIKE :指定の文字列パターンが含まれるデータ

BEGINSWITH 、ENDSWITH :指定の文字列で始まる、終わるデータ

IN :指定の文字列のリスト({%@,%@,%@}と指定)のいずれかが合致するデータ

というように指定できます。

 

複数の条件を指定して取得

例として、日付と優先度を条件として取得するメソッドを作成します。

 

getAllDataByDayAndPriority(date: Date(), priority: 2)

これで、日付が本日以降、優先度が2以上のデータのみ取得します。

 

データの計算結果を参考にして取得

 

例として、登録されている優先度の平均値を超えるデータのみ取得するメソッドを作成します。

 

@avg 平均値の取得の他にも、

@max :最高値、@min :最低値、@sum :合計値、@count :データ件数の取得も可能です。

 


以上、SwiftUIでのCoreData内のデータ取得メソッドの実装と、NSPredicateによる条件指定方法を解説しました。