【iOS】Realm Database簡単解説＆サンプル！超簡単で高性能なモバイルデータベース！みんな使お？？

#はじめに
Realm Databaseの簡単な解説とサンプルの記事です。
Realm自体、もう登場してから何年か経っているので
それなりに記事も出てきています！
なので特に目新しい事は無いかもしれませんが、
生暖かい目で見てくださいｗ

#Realm Databaseとは

###特徴はざっくり言うと次の通り

- モバイル向けに作られたNoSQLのデータベース
　（データの抽出はNSPredicateを利用する）
- SQLite、CoreDataより高速！
- 従来のテーブル定義がクラス定義になっている！
- 1体多のリレーションが持てる
- バックアップ、リストアが可能

この中でも**「従来のテーブル定義がクラス定義になっている」**という所が
私の中では一番のメリットだと思います！
このおかげてSwiftでアプリを作ってる方であれば
比較的抵抗無くデータベースを構築できると思います！

言葉だけではイメージが湧かないと思いますので、
さっそくサンプルを見ていきましょう！
ちなみに今回はRealmの導入方法は記載していません。
導入方法を探している方は他の記事をあたってください。すみませんm(_ _)m
CocoaPodsなりCarthageなり好きな方法でプロジェクトに追加してください！
私はCarthageで入れました！

#サンプル

###クラス定義（テーブル定義）
普通のデータベースでいうところのテーブル定義ですね。
人に見立てたPersonというクラスを定義します！

```swift:Person.swift
import RealmSwift
import Foundation

class Person: Object {
    /// 名前
    @objc dynamic var name: String = ""
    /// 年齢
    @objc dynamic var age: Int = 0
    /// ID
    @objc dynamic var id: String = NSUUID().uuidString
    /// 作成日時
    @objc dynamic var createDate: Date = Date()
    
    /// IDをプライマリキーに設定
    override static func primaryKey() -> String? {
        return "id"
    }
}
```

これだけでテーブル定義ができます。

####プライマリキーの設定
プライマリキーの設定は`primaryKey`をoverrideして
プライマリキーに設定するプロパティ名を返すだけです。
ちなみにIDにはUUIDを設定するようにしています。

####作成日時の設定
作成日時は現在日時を初期値で設定しています。

###データの追加（レコードの追加）
データの追加もインスタンスを生成して
Realmのインスタンス（標準Realmと言ったらいいのか？）に追加するだけです。

```swift:hoge.swift
    /// Personを追加します
    private func addPerson() {
        do {
            let realm = try Realm()
            let newPerson = Person()
            try realm.write {
                realm.add(newPerson)
            }
        } catch {
            // 例外
        }
    }
```


プロパティも一緒に設定する場合は次の通り`value`に設定します。

```swift:hoge.swift
    /// 名前、年齢を設定したPersonを追加します
    private func addPerson(name: String, age: Int) {
        do {
            let realm = try Realm()
            let newPerson = Person(value: ["name": name, "age": age])
            try realm.write {
                realm.add(newPerson)
            }
        } catch {
            // 例外
        }
    }
```

####注意点
データの操作（追加、更新、削除）をする場合は必ず`realm.write`のトランザクション内で行ってください。
じゃないとアプリが落ちます😥😥😥

###データの更新（レコードの更新）
データの更新はRealmからデータを取得して更新するだけです！
サンプルは名前を変更しています。

```swift:hoge.swift
    /// Personの名前を更新します
    private func updatePerson(id: String, name: String) {
        do {
            let realm = try Realm()
            let person = realm.objects(Person.self).filter(NSPredicate.init(format: "id == %@", argumentArray: [id])).first
            try realm.write {
                person?.name = name
            }
        } catch {
            // 例外
        }
    }
```

NSPredicateを利用してidを元に絞り込んだデータを
writeトランザクション内で名前を変更するだけです。
ほとんど普通のクラスのプロパティ操作と変わらない！素晴らしい！めちゃ簡単！

###データの削除（レコードの削除）
更新のときと同じでRealmからデータを取得し、削除するだけです！

```swift:hoge.swift
    /// Personを削除します
    private func deletePerson(id: String) {
        do {
            let realm = try! Realm()
            let persons = realm.objects(Person.self).filter(NSPredicate.init(format: "id == %@", argumentArray: [id]))
            try realm.write {
                realm.delete(persons)
            }
        } catch {
            // 例外
        }
    }
```

#最後に

いかがだったでしょうか！
今までiOSのデータベースはなんだか敷居が高いって思っていた方も
これを見れば意外と簡単やん！ってなったと思います！
どんどん使っていきましょう！
この記事読んでる方は大丈夫だと思いますが、
UserDefaultsでなんでもかんでもデータ持つのは絶対駄目ですよｗｗｗ

まだまだ色々書きたい事があるので
今度は今回の内容と下記事項を含め、まとめ記事を書きたいと思います！
・導入方法
・1対1のリレーションシップ
・1対多のリレーションシップ
・バックアップ、リストアの方法
・マイグレーション（プロパティ（カラム）の追加）


間違いなどありましたがご指摘頂ければ幸いです。
最後までご覧いただき、ありがとうございました！