【SwiftUI】Core Dataの使い方:エンティエィ(Entity)を定義する

(2021/04/26 更新)

Xcodeでエンティティを定義する方法を解説します。

スポンサーリンク

環境

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

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

エンティティとは

Core Dataにおけるエンティティとは、DBのテーブルをクラスで表したもので、テーブルが持つ属性やリレーションなどの情報を持ちます。
Core DataではDBのレコードをオブジェクトとして扱う為、このクラス定義が必要となります。

スポンサーリンク

エンティティを定義する

エンティティの定義には、XcodeのModel Editor(拡張子が.xcdatamodeld)を使用します。
Model Editorはプロジェクト作成時にUse Core Dataチェックを入れると自動で生成されますが、後から手動でファイル追加も可能です。

エンティティを定義する

エンティティの生成方法

  1. 左のProject navigatorでModel Editorを選択
  2. 画面下部のAdd Entityボタンのクリックで、エンティティ(Entity)が追加される
  3. 追加されたEntityをクリックして名称を変更する(1文字目は大文字必須)

エンティの削除方法

  1. 対象のエンティティを選択した状態でキーボードのDeleteキーを押す

属性情報の変更方法

  1. エンティティを選択すると、右のAttributesに対象エンティティの属性情報が表示される
  2. Attributes下の「+」ボタンで属性追加、「ー」ボタンで属性削除
  3. 属性名のクリックで名称変更が可能(1文字目は小文字必須)
  4. Typeを選択すると属性のタイプが変更可能

属性名について注意点

属性名には、NSObjectやNSManagedObjectが持つメソッドやプロパティと重なる名前が使えません。
例えば"class"や、"className"などを指定すると、次のようなダイアログ(警告)が表示されます。
"Property name clashes with a method implemented by NSManagedObject or NSObject"
警告メッセージ

スポンサーリンク

エンティティのクラスファイル生成について

定義したエンティティに対応するクラスファイルは、デフォルトの設定ではビルド時に自動生成されます。
その為、ビルド前にコードで該当クラスを使う記述があると、次のようにエラー"Cannot find type 'xxxxx' in scope"が発生する場合がありますが、一度ビルドを実行すると解消します。

エラー発生

ビルドしてもエラーが消えない場合は、XcodeのメニューからProduct > Clean Build Folder実行後、Xcodeを再起動してからもう一度ビルドしてみて下さい。
それでも消えない場合は、クラス名を間違えている等、別の原因があると思われます。

コード生成オプション

エンティティのコード生成オプション(Codegen)で、クラスファイルの生成方式を選択可能です。
Model Editorで対象のエンティティを選択し、属性インスペクタを開くとコード生成オプション(Codegen)の設定を確認/変更できます。

コード生成オプション

選択できるオプションは次の3つです。

Class Definition(デフォルト設定)

エンティティに対応したクラスをビルド時に自動生成します。
ソースコードは生成されませんので、コードによるカスタマイズが不要の場合は、こちらを選択します。
手動で作成したコードが存在しているとビルド時に重複エラー"Multiple commands produce ..."となりますので注意して下さい。

Manual/None

エンティティに対応したクラスをビルド時に自動生成しません。
こちらを選択した場合は後述する方法でコードを生成する必要があります。
必要なファイルは次の2つ

エンティティ名+CoreDataClass.swift
エンティティに固有の実装を定義するファイル。

エンティティ名+CoreDataProperties.swift
エンティティの属性情報を定義するファイル。

Category/Extention

エンティティに対応した2つのコードのうち、エンティティの固有実装を定義する"エンティティ名+CoreDataClass.swift"をビルド時に自動生成しません
属性情報はModel Editor上で設定し、固有の実装のみコードで記述したい場合にはこちらを選択します。

スポンサーリンク

コードの手動生成方法

Model Editorを開き対象のエンティティを選択した状態で、メニューより Editor > Create NSManagedObject Subclass...を選びます。

1.対象のデータモデルを選択
「Next」を選択でOK

データモデルの選択

2.対象のエンティティ(Entity)を選択
コードを生成したい、エンティティをチェックして「Next」

エンティティの選択

3.フォルダの選択
コードを格納するフォルダを選択して「Create」

フォルダの選択

※画面右側の上部が実フォルダの場所、下部のGroupがXcodeのProject navigtorでの表示位置を示します。

生成されるコード

次の2種類のコードが生成されます。

生成されるコード

エンティティ名+CoreDataClass.swift

エンティティに固有の実装を定義する為のファイルです。

エンティティ名+CoreDataProperties.swift

エンティティの属性情報を定義するファイルです。

スポンサーリンク

属性情報のoptional問題

Student+CoreDataProperties.swiftの次のコードに注目しましょう。

これはStudentエンティティの各属性の型が定義されている箇所ですが、数値のabsentDays以外はデフォルトでオプショナルとなっています。
この為、データベースの検索結果をコードで扱う場合、対象属性のアンラップ処理や、nil結合演算子(??)によるデフォルト値の設定など煩雑な手続きが必要となります。

nilが入らないことが確実な場合は、単純にオプショナルを外すと一見うまく動くように見えますが、Core Dataの仕様上実際には開発者の意図に沿わずnilになるケースがある為お勧めしません。

その代わりに、オプショナル値に安全にアクセスするのに役立つ、計算プロパティの追加の検討すると良いでしょう。
対象属性がnilだった場合のデフォルト値定義を1箇所に集め、残りのコードではオプション性を気にする必要がなくなります。

スポンサーリンク

合わせて読みたい記事

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