[Realm] モデルを作成してデータを登録する

はじめに

Realmは様々なプラットフォームで使用可能な軽量データベースです。

Realmのインストールについては、過去の記事「CarthageとRealmのインストール」を参照してください。

本記事では、Realm用のモデル作成とデータの登録方法について備忘録として記載します。

環境

Xcode:9.2
Swift:4.0.3
RealmSwift:3.3.2

プロジェクトの作成

新規でSingle View Appのプロジェクトを作成したら、過去記事を参考にSwiftRealmを導入します。

モデルの作成

ここでは、部署と部署に属する社員を管理するモデルを作成します。

部署モデルでは、「部署名」とマネージャーの「氏名」、部に属する「社員」を管理できるようにします。

新規で「Department.swift」というSwift Fileを作成し、Departmentクラスを以下のように作成します。

import Foundation
import RealmSwift

class Department: Object {
    // 部署名
    @objc dynamic var name : String = ""
    // マネージャーの氏名
    @objc dynamic var manager : String = ""
    // 部に属する社員
    let employees = List<Employee>()
    
    // プライマリーキー
    override static func primaryKey() -> String? {
        return "name"
    }
    
    // インデックス
    override static func indexedProperties() -> [String] {
        return ["name"]
    }
}

Realm用のモデルを作成するには、「import RealmSwift」が必要です。また、クラスはObjectを継承する必要があります。

モデルに登録するそれぞれの項目はプロパティとして定義します。このとき「@objc dynamic var」で宣言します。

プロパティで使用できるデータ型にはBool、Int、Int8、Int16、Int32、Int64、Double、Float、String、Date、とDataがあります。

部署名やマネージャーの氏名は文字列を登録しますのでString型にしています。

また、部に属する社員は複数登録できるようにList<epmplyee>としています。

次に、社員を管理するEmplyeeクラスを作成します。このクラスは先ほど作成したDepartment.swiftの中に作成しても構いません。

class Employee : Object {
    // 社員の氏名
    @objc dynamic var name: String = ""
    // 社員の年齢
    @objc dynamic var age: String = ""
}

以上でモデルの作成は完了です。

データを登録してみる

それではデータを登録してみましょう。

はじめに部署のみを登録する方法をみてみます。

let realm = try! Realm()  // Realmの初期化

// Engineer型オブジェクトの作成
let dept = Department()
// Realmへのオブジェクトの書き込み
try! realm.write {
    dept.name = "システム部"
    dept.manager = "Bill"
    realm.add(dept)
}

はじめにRealmの初期化を行います。

次に、部署を管理するEngineerのオブジェクト(インスタンス)を作成します(4行目)。

あとは、realm.writeメソッドを使用してデータを登録します(6行目以降)。

Realm Browserで確認すると以下のようにデータが登録できていることが確認できます。参考「[Tips] Realmファイルの保存先を知るには?

この時点ではEmployeesは「0」になっているので登録されていないことがわかります。

子データを登録する

今度は、部署に属する社員を登録してみましょう。

社員を登録するには、まず登録先の部署を検索して取得する必要があります。

検索するにはRealmインスタンスのobjectsが持つfilterメソッドを使用します。以下にコード例を示します。ここでは「nameが’システム部’と等しい」を条件にして抽出しています。

let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first

つづいて、部に追加する社員を作成します。

let emp = Employee()
emp.name = "Oscar"
emp.age = "23"

あとは、writeメソッドを使用して登録をするだけです。部を検索して社員を登録するまでのコードを以下に示します。

let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first
let emp = Employee()
emp.name = "Oscar"
emp.age = "23"
try! realm.write {
    dept?.employees.append(emp)
}

登録が成功すると以下のように社員が登録できていることを確認できます。

子データを削除する

続いて子データを削除してみましょう。

先ほどのfilterメソッドを使用して、システム部を検索し、さらにシステム部に属する「Oscar」を削除する場合は以下のようにします。

// 子データの削除
let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first
let emp = dept?.employees.filter("name == 'Oscar'").first

try! realm.write {
    realm.delete(emp!)
}

削除はrealm.writeメソッドの中で「realm.delete(削除したいオブジェクト)」とします。

親データを削除する

親データも子データ同様にfilterメソッドで特定して削除をします。

// 親データの削除
let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first

try! realm.write {
    realm.delete(dept!)
}

Realmファイルを削除するには

Realmによるデータは、Realmファイルに格納されます。何らかの事情でリセットしたい場合は以下のコードを書くことでまっさらにすることができます。

let realmURL = Realm.Configuration.defaultConfiguration.fileURL!
let realmURLs = [
    realmURL,
    realmURL.appendingPathExtension("lock"),
    realmURL.appendingPathExtension("note"),
    realmURL.appendingPathExtension("management")
]
for URL in realmURLs {
    do {
        try FileManager.default.removeItem(at: URL)
    } catch {
        // handle error
    }
}

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください