[iOS] Realmを使ってみた 〜環境構築からCRUDまで〜

2017.01.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんぬづは、勉強会仲間とYahoo Hack Dayに参戦することが決まった田中です。約一年ぶりのハッカソン参戦ですが、今から楽しみで血湧き肉躍る感覚があります。

さて、iOS/Swift界隈ではもうだいぶ浸透してきたように感じるモバイルデータベースのRealmですが、お恥ずかしながらつい最近やっと使い始めたので今回はその始め方をまとめていきます。

扱う内容は以下になります。

  • Realmの導入方法
  • Realmで基本的な使い方
    • オブジェクトの生成
    • レコードの書き込み
    • レコードの読み込み
    • レコードの更新
    • レコードの削除

検証環境

  • Xcode 8.2.1
  • iOS 10.2
  • Swift 3.0.2
  • Realm 2.1.2
  • RealmSwift 2.1.2

Realmの導入方法

Dynamic Framework, CocoaPods, Carthageを使ってインストールすることができます。詳しくはこちらより。

CocoaPodsを使う場合はPodfileにuse_frameworks!pod 'RealmSwift'を記述します。

そしてもう一つ、プロジェクトで使用しているSwiftのバージョンも指定する必要があるので、以下もPodfileに記述します。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '2.3' # or '3.0'
    end
  end
end

あとはpod installでRealmをインストールできます。

Realmの基本的な使い方

Realmのオブジェクトの生成、Realmの読み書きなどを行うファイルではimport RealmSwiftしてください。

オブジェクトの生成

RealmSwiftに含まれるObject型を継承したクラスを作ります。そのプロパティはdynamic varで宣言します。

class Person: Object {
    dynamic var name = ""
    dynamic var age  = 0
    dynamic var sec  = ""
}

Personの生成は以下のようになります。

let tanaka = Person()
tanaka.name = "田中"
tanaka.age  = 23
tanaka.sex  = "MALE"

レコードの書き込み

realm.write()の中でrealm.add()を呼び出して引数に生成したRealmのオブジェクトを渡します。

let realm = try! Realm()

let tanaka = Person()
tanaka.name = "田中"
tanaka.age  = 23
tanaka.sex  = "MALE"

try! realm.write() {
    realm.add(tanaka)
}

レコードの読み込み

特定の型のレコードを全件取得

let realm = try! Realm()
realm.objects(Person.self)

ageカラムが20以上のレコードを全件取得(数値)

let realm = try! Realm()
realm.objects(Person.self).filter("age >= 20")

sexカラムで 'MALE' の文字列と一致するレコードを全件取得(文字列, NSPredicate)

let realm = try! Realm()
realm.objects(Person.self).filter("sex like 'MALE'")

nameカラムに '田中' の文字列を含むレコードを全件取得(文字列, NSPredicate)

let realm = try! Realm()
realm.objects(Person.self).filter("name contains '田中'")

レコードの更新

例えば取得したPerson型の配列の一番最初のnameを '田中' に変更する場合はこう。

let realm = try! Realm()
let firstPerson = realm.objects(Person.self).first

try! realm.write() {
    firstPerson?.name = "田中"
}

もう一つの例として、 '西木野' を '田中' に変更する場合はforEachで回して、毎回realm.write()する。

let realm = try! Realm()
let nishikinos = realm.objects(Person.self).filter("name like '西木野'")
        
nishikinos.forEach { nishikino in
    try! realm.write() {
        nishikino.name = "田中"
    }
}

レコードの削除

例えば取得したPerson型の配列の一番最初のオブジェクトを削除する場合はこう。

let realm = try! Realm()

if let firstPerson = realm.objects(Person.self).first {
    try! realm.write() {
        realm.delete(firstPerson)
    }
}

もう一つの例として、取得した田中を全件削除する場合はforEachで回して、毎回realm.write()する。

let realm = try! Realm()
let tanakas = realm.objects(Person.self).filter("name like '田中'")
        
tanakas.forEach { tanaka in
    try! realm.write() {
        realm.delete(tanaka)
    }
}

まとめ

Realmの基本的な部分について書きました。

レコードの取得、取得からの加工がSwiftらしく直感的に行える印象でとても良いと感じました。今後はRealm Browserの使い方やリレーションの組み方についても学んでいきたいと思います。ひと段落し次第またブログでまとめたいと思います。

参考・関連