■はじめに
データを永続的に保存する方法で、数々の方法があります。
以下に一例を挙げます。
・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)
}
}