【Swift/Core Data】RelationShipの実装方法!テーブル連携

【Swift/Core Data】RelationShipの実装方法!テーブル連携

この記事からわかること

  • SwiftCore Data利用する方法
  • エンティティ(NSManagedObject)にRelationShipを設定する方法
  • 一対一一対多などのリレーション実装
  • Inverseとは?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

公式リファレンス:Core Data

環境

RelationShipとは?

RelationShipとは異なるテーブル同士の関係を紐付けることです。これにより複数のテーブルがまるで1つのテーブルのように扱うことができ、レコード(行)に重複した情報を持たせる必要がなくなるため、スッキリとしたデータ構造で管理することができるようになります。例えばPersonテーブルとCompanyテーブルがある場合、RelationShipを活用することで人の情報と会社の情報を切り離して定義することができるようになります。

以下のテーブルではPersonテーブルの「会社」で関係が紐づいています。

Personテーブル

id 名前 年齢 会社
1 吉田 真紘 27 ABCデザイン
2 長谷 慎二 34 ABCデザイン
3 川本 依 17 XYZ制作

Companyテーブル

id 名前 所在地
1 ABCデザイン 東京都
2 XYZ制作 神奈川県

RelationShipのタイプ

RelationShipには関係性の違いから3つのタイプに分かれています。

一対一リレーションシップ

各レコードが別のテーブル内のただ一つのレコードと関連付けられている状態。例えば、Personから見てCompanyは一対一リレーションシップの関係になる

一対多リレーションシップ

あるテーブルの一つのレコードが別のテーブル内の複数のレコードと関連付けられている状態。Companyには複数のPersonが紐づいているので一対多リレーションシップの関係になる

多対多リレーションシップ

両方のテーブルが複数のレコード同士を関連付けている状態。学生と科目のような関係で、1人の学生が複数の科目を取り、1つの科目が複数の学生によって選ばれる場合に多対多リレーションシップの関係になる

Core DataでRelationshipを実装する方法

Core Dataでエンティティ(テーブル)同士のRelationshipを実装するには「プロジェクト名.xcdatamodel」から設定します。まずはPersonエンティティとCompanyエンティティをそれぞれ定義します。この際にPersonエンティティにcompany属性を定義する必要はありません

定義できたらまずはPersonエンティティを選択した状態で「Relationships」の「+」をクリックし、以下のように入力します。「Relationship」はlowercase記法で入力する必要があります。

Relationship Destination Inverse
company Company 未選択
【Swift/Core Data】RelationShipの実装方法!テーブル連携

続いてCompanyエンティティを選択し同様に「Relationships」の「+」をクリックし以下のように入力します。

Relationship Destination Inverse
person Person company
【Swift/Core Data】RelationShipの実装方法!テーブル連携

これでエンティティ同士の一対一での紐付けが完了し、Person側の「Inverse」も自動でpersonに変更されます。ビルドするとプロパティファイルも自動で以下のように更新されCompanyプロパティが追加されていることを確認できます。


extension Person {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Person> {
        return NSFetchRequest<Person>(entityName: "Person")
    }

    @NSManaged public var age: Int16
    @NSManaged public var id: UUID?
    @NSManaged public var name: String?
    @NSManaged public var company: Company?

}

Inverse:相互リレーション

Inverse」では相互リレーション(逆関係)の設定を行なっています。相互リレーションとは片側のエンティティを追加や削除した場合に相互リレーション関係のエンティティが自動で更新されるようにする仕組みです。

これを設定しておくことでデータを操作したことによる齟齬を減らせることができるので、適切なInverse先を指定しておくことをお勧めします。

一対多リレーションを実装する

今回ではPerson→Companyは一対一ですが、Company→Person一対多の関係にしたいのでもう少し設定していきます。

一対多リレーションを実装するにはCompanyエンティティを選択し追加した「Relationships」を選択した状態で右側のインスペクタエリアから「To Many」を選択します。

【Swift/Core Data】RelationShipの実装方法!テーブル連携

これで一対多リレーションの実装は完了なので一度ビルドするとプロパティファイルが更新されNSSet(Set)型でPersonを保持するプロパティが追加されていることを確認できます。


extension Company {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Company> {
        return NSFetchRequest<Company>(entityName: "Company")
    }

    @NSManaged public var id: UUID?
    @NSManaged public var location: String?
    @NSManaged public var name: String?
    @NSManaged public var person: NSSet?

}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index