このページではRealmでのモデルの定義方法について解説します。
モデルの定義
モデルを定義するには、swiftファイルを新規で作成し、次のように書きます。
import Foundation
import RealmSwift
// 社員モデル
class Employee: Object {
@objc dynamic var name: String = "" // 社員名
@objc dynamic var department: String = "" // 部署
}
基本の書き方としては、
- RealmSwiftをimport
- Objectを継承したクラスを作成
- プロパティには 「@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" // 主キーの名称
}
}
(2024/11/21 22:37:26時点 Amazon調べ-詳細)