9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-05

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

#Realm Databaseとは

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

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

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

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

#サンプル

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

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と言ったらいいのか?)に追加するだけです。

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

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

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からデータを取得して更新するだけです!
サンプルは名前を変更しています。

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からデータを取得し、削除するだけです!

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でなんでもかんでもデータ持つのは絶対駄目ですよwww

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

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

9
7
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?