【Realm】モデルの定義・リレーション

このページではRealmでのモデルの定義方法について解説します。

モデルの定義

モデルを定義するには、swiftファイルを新規で作成し、次のように書きます。

import Foundation
import RealmSwift 

// 社員モデル
class  Employee: Object {
  @objc dynamic var name: String = ""  // 社員名
  @objc dynamic var department: String = ""  // 部署
}

基本の書き方としては、

  1. RealmSwiftをimport
  2.  Objectを継承したクラスを作成
  3.  プロパティには 「@objc dynamic var」をつける

となります。



リレーションの定義

1対1のリレーション

例えば、社員一人一人が、コンピュータを1台持つものとすると、「社員モデル」と「コンピュターモデル」は1体1の関係になります。

この場合、次のように書くことで、リレーションの定義ができます。

import Foundation
import RealmSwift 

// 社員モデル
class  Employee: Object {
  @objc dynamic var name: String = ""  // 社員名
  @objc dynamic var department: String = ""  // 部署
  @objc dynamic var computer: Computer? // Computerモデルと1対1の関係  
}

// コンピュータモデル
class Computer: Object {
  @objc dynamic var name: String = ""  // コンピューター名前
  @objc dynamic var brand: String = ""  // メーカー
}

EmployeeとComputerに1対1のリレーションを定義させるために、Employeeモデルにcomputerプロパティを定義しています。

このときのデータ型には「?」を付けオプショナル型とします。

1対Nのリレーション

続いて、部署モデルを作ったとすると、1つ1つの部署には複数の社員が属することになります。

そのため、部署と社員の関係は「1対N」になりますね。

この場合の、リレーションの定義方法は次のようになります。

import Foundation
import RealmSwift 

// 部署モデル
class Department: Object {
  @objc dynamic var name: String = ""  // 部署名
  let employees = List<Employee> ()  // Employeeモデルと1対Nの関係
}

// 社員モデル
class  Employee: Object {
  @objc dynamic var name: String = ""  // 社員名
  @objc dynamic var department: String = ""  // 部署
  @objc dynamic var computer: Computer? // Computerモデルと1対1の関係  
}

// コンピュータモデル
class Computer: Object {
  @objc dynamic var name: String = ""  // コンピューター名前
  @objc dynamic var brand: String = ""  // メーカー
}

DepartmentとEmployeeに1対Nの関係を持たせるために、Departmentモデルにemployeesプロパティを定義しています。

注意点としては1体Nの関係の場合、データ型はList型になります。

逆方向のリレーション

先ほど例に挙げた「1:1」、「1:N」のリレーションはどちらも「社員→コンピューター」、「部署→社員」の一方通行のリレーションです。

そのため、逆方向のリレーションを定義したい場合はLinkingObjects」を使います。

書き方は次の通り。

let プロパティ名 = LinkingObjects(fromType: 親クラス.self, property: "親クラスが持つ子クラスのプロパティ名")

例えば先ほどの「部署モデル」と「社員モデル」を使って、「社員モデル」→「部署モデル」へ逆方向のリレーションを定義したい場合は、社員モデルに次のように書くことができます。

import Foundation
import RealmSwift 

// 部署モデル
class Department: Object {
  @objc dynamic var name: String = ""  // 部署名
  let employees = List<Employee> ()  // Employeeモデルと1対Nの関係
}

// 社員モデル
class  Employee: Object {
  @objc dynamic var name: String = ""  // 社員名
  @objc dynamic var department: String = ""  // 部署
  @objc dynamic var computer: Computer? // Computerモデルと1対1の関係  
  let parentCategory = LinkingObjects(fromType: Department.self, property: "employees") // 逆方向のリレーション 
}

// コンピュータモデル
class Computer: Object {
  @objc dynamic var name: String = ""  // コンピューター名前
  @objc dynamic var brand: String = ""  // メーカー
}

こうすることで、EmployeeからDepartmentの情報を取得することができます。

主キーの設定

主キーを設定するには、Objectクラスが持つprimaryKey()メソッドをオーバーライドし、主キーを返却します。

import Foundation
import RealmSwift 

// 社員モデル
class  Employee: Object {
  @objc dynamic var name: String = ""  // 社員名
  @objc dynamic var department: String = ""  // 部署
  
  //主キーの設定(必要な場合)   
  override static func primaryKey() -> String? { 
    return "name" // 主キーの名称 
  }
}
created by Rinker
¥3,168 (2022/12/07 11:48:32時点 Amazon調べ-詳細)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA