#はじめに
Realm Databaseの簡単な解説とサンプルの記事です。
Realm自体、もう登場してから何年か経っているので
それなりに記事も出てきています!
なので特に目新しい事は無いかもしれませんが、
生暖かい目で見てくださいw
#Realm Databaseとは
###特徴はざっくり言うと次の通り
- モバイル向けに作られたNoSQLのデータベース
(データの抽出はNSPredicateを利用する) - SQLite、CoreDataより高速!
- 従来のテーブル定義がクラス定義になっている!
- 1体多のリレーションが持てる
- バックアップ、リストアが可能
この中でも**「従来のテーブル定義がクラス定義になっている」**という所が
私の中では一番のメリットだと思います!
このおかげてSwiftでアプリを作ってる方であれば
比較的抵抗無くデータベースを構築できると思います!
言葉だけではイメージが湧かないと思いますので、
さっそくサンプルを見ていきましょう!
ちなみに今回はRealmの導入方法は記載していません。
導入方法を探している方は他の記事をあたってください。すみませんm(_ _)m
CocoaPodsなりCarthageなり好きな方法でプロジェクトに追加してください!
私はCarthageで入れました!
#サンプル
###クラス定義(テーブル定義)
普通のデータベースでいうところのテーブル定義ですね。
人に見立てたPersonというクラスを定義します!
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と言ったらいいのか?)に追加するだけです。
/// Personを追加します
private func addPerson() {
do {
let realm = try Realm()
let newPerson = Person()
try realm.write {
realm.add(newPerson)
}
} catch {
// 例外
}
}
プロパティも一緒に設定する場合は次の通りvalue
に設定します。
/// 名前、年齢を設定した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からデータを取得して更新するだけです!
サンプルは名前を変更しています。
/// 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からデータを取得し、削除するだけです!
/// 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対多のリレーションシップ
・バックアップ、リストアの方法
・マイグレーション(プロパティ(カラム)の追加)
間違いなどありましたがご指摘頂ければ幸いです。
最後までご覧いただき、ありがとうございました!