技術ブログ

プログラミング、IT関連の記事中心

Realm【Swift】

■はじめに

データを永続的に保存する方法で、数々の方法があります。
以下に一例を挙げます。
・UserDefaults
・CoreData
SQLite
・Realm

ここでは、「Realm」に関して記載します。

◾️Realm(レルム)とは

Realm(レルム)とは、クロスプラットフォームに対応しているデータベースです。(Mobileデータベース)

SQLiteやCoreDataなどと比べて、速度が早い(性能がいい)、実装が容易などの利点があります。
また、無料で利用できるのも大きなメリットです。

Realmには、以下の種類がありますが、ここでは「Realm Database」に関して記載します。

【Realm Database】
・オフラインで利用できるデータベースサービス(SQLiteやCoreDataと同様のサービス)

【Realm Platform】
・「Realm Database」で管理するデータをクラウドでマルチデバイスに同期する事ができるmBaaSサービス

【Realm Studio】
・「Realm Platform」のデータを操作(参照、削除など)する事ができる開発ツール

◾️Realmのインストール

RealmのインストールにはCocoaPodsを使用できます。
※CocoaPodsに関しては記載を省きます。

以下のPodを追加する事でインストールを行う事ができます。

pod 'RealmSwift'

◾️Realmのテーブルの作成

「Realmのテーブルの作成」と書きましたが、Realmにはテーブルという概念がありません。
では、どのようにデータを登録するのかですが、登録するObjectをまとめたクラスを作成します。
このクラスが、SQLでいう所のテーブルになります。

具体的には、以下のようなクラスを作成します。
※例では、String型とInt型のみ記載していますが、他の型も定義可能です。

import RealmSwift

class TargetData: Object {
    @objc dynamic var name: String = ""
    @objc dynamic var age: Int = 0
    @objc dynamic var tag: String = ""
}

◾️データの登録(CREATE)

「Realmのテーブルの作成」で作成したクラス(以降は「オブジェクトクラス」と記載する。)に対して、実際にデータを登録する方法を記載します。
Javaなどを触った事がある人は、イメージが付きますかね?Beanのような使い方になります。

登録する方法は以下です。
※登録処理を記載するクラスでは「RealmSwift」をインポートするようにしてください。

// Realmのインスタンスを生成
let realm = try! Realm()

// 登録するオブジェクトクラスのインスタンス生成、パラメータへのデータの代入
let tgt = TargetData()
tgt.name = "あいうえお"
tgt.age = 19
tgt.tag = "AAAA"

// 書き込みを行う
try! realm.write() {
    realm.add(tgt)
}

◾️データの取得(READ)

「データの登録(CREATE)」で作成したデータを取得する方法を記載します。

取得する方法は以下です。
※取得処理を記載するクラスでは「RealmSwift」をインポートするようにしてください。

// Realmのインスタンスを生成
let realm = try! Realm()
// 引数に設定したオブジェクトクラスのデータを取得する
realm.objects(TargetData.self)

SQLを使用した事がある人はイメージがつくかもしれませんが、条件を絞ってデータを取得したい場合もあります。
その場合には、以下のように記載します。
※例では、いくつかのパターンを記載します。

// Realmのインスタンスを生成
let realm = try! Realm()

// ageカラムが30以上のレコードを全件取得
realm.objects(TargetData.self).filter("age >= 30")

// 一致(tagカラムが 'AAAA' の文字列と一致するレコードを全件取得)
realm.objects(TargetData.self).filter("tag like 'AAAA'")

// 部分一致(nameカラムに 'あ' の文字列を含むレコードを全件取得)
realm.objects(TargetData.self).filter("name contains 'あ'")

取得したデータから、必要なオブジェクトを取得して以降の処理で使用したい場合には、以下のような使い方ができる。

// Realmのインスタンスを生成
let realm = try! Realm()

// 取得処理の戻り値を変数に設定
let targets = realm.objects(TargetData.self)
// 配列をループさせてデータを取り出す
for target in targets {
    // 各オブジェクトを取得することができる
    print(target.name)
}

◾️データの更新(UPDATE)

すでにオブジェクトクラスに設定したデータを更新したい場合には、以下のように更新することができる。
※取得の時のように条件を指定しての更新も可能です。
※更新処理を記載するクラスでは「RealmSwift」をインポートするようにしてください。

// Realmのインスタンスを生成
let realm = try! Realm()

// 一番最初に登録したデータのnameを 'さしすせそ' に変更
let firstPerson = realm.objects(TargetData.self).first
try! realm.write() {
    firstPerson?.name = "さしすせそ"
}

// 'あいうえお' を全て 'かきくけこ' に変更
let aiueo = realm.objects(TargetData.self).filter("name like 'あいうえお'")
aiueo.forEach { tgt in
    try! realm.write() {
        tgt.name = "かきくけこ"
    }
}

◾️データの削除(DELETE)

すでにオブジェクトクラスに設定したデータを削除したい場合には、以下のように削除することができる。
※取得の時のように条件を指定しての削除も可能です。
※削除処理を記載するクラスでは「RealmSwift」をインポートするようにしてください。

// Realmのインスタンスを生成
let realm = try! Realm()

// 一番最初に登録したデータを削除
if let firstPerson = realm.objects(TargetData.self).first {
    try! realm.write() {
        realm.delete(firstPerson)
    }
}

// 'あいうえお'を全件削除する場合
let aiueo = realm.objects(TargetData.self).filter("name like 'あいうえお'")
aiueo.forEach { tgt in
    try! realm.write() {
        realm.delete(tgt)
    }
}