SwiftでRealmを動かしてみる


はじめに

公式らしきページを参考にしました。
https://realm.io/docs/swift/latest

プロジェクトにRealmを導入する方法として3種類提示されています。
「Dynamic framework」「CocoaPods」「Carthage」の三種類です。

よく説明などに出てきがちなCocoaPodsを今回も使おうと思って試しましたが、いざプロジェクトを作ってRealmをimportしようとすると「No such module」のエラーが出て前に進めなくなったので今回は「Dynamic framework」に記載されている内容で進めて見ました。
私のやり方が悪いのか毎回CocoaPodsは何かしら問題が発生してしまった気持ちが落ち込みます。

前提

先に適当にプロジェクトを作っている状態からの手順となります。

プロジェクトの準備

まずはRealmのホームページから最新版をダウンロードして解凍します。

「ios」「watchos」「tvos」などのフォルダが並んでいます。
今回はiOS向けとして作るので「iOS」フォルダを開きます。

するとバージョンごとのswiftフォルダがあります。
このバージョンはswiftのバージョンではなくxcodeのバージョンのようです。
xcodeでバージョンを確認し、当てはまるバージョンのswiftフォルダを開きます。

「Realm.framework」「RealmSwift.framework」の2つのファイルがあります。

上記の2つのファイルをプロジェクトの設定のGeneralの中にあるEmbedded Binariesの赤枠部分にドラッグします。

すると下のような画面が開くのでそのままFinishをクリックします。

データを追加して読み込んで見る

上記の手順ですでにRealmが使える状態になっています。

よくあるRDBMSしか使ったことがないと考え方が理解し辛いですが、まずテーブル定義の代わりとなるクラスをswiftで作成します。

名前と年齢を持ってるメンバークラスの例です。

Member.swift
import RealmSwift
import Foundation
class Member : Object {
    @objc dynamic var name = ""
    @objc dynamic var age = 0
}

次にViewController.swiftにデータの追加と読み込み処理を書いてみます。

ViewController.swift
import UIKit
import RealmSwift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        //Memberクラスに名前と年齢を突っ込む
        let MyMembers = Member()
        MyMembers.name = "Taro"
        MyMembers.age = 30

        //追加処理をしてみる
        let realm = try! Realm()
        try! realm.write {
            realm.add(MyMembers)
        }

        //今回は1データしか追加してませんが一応Memberの全データを読み出してみる
        let Members = realm.objects(Member.self)
        for member in Members {
            print("name:" + member.name)
            print("age:" + String(member.age))
        }
    }
}

太郎と次郎と突っ込んだりして遊んでたらいっぱい出てきました。

最後に

SQLiteやRealmなど使い勝手のよいデータベースが存在することは知っていましたが難しそうだと思ってデータベースには手を出さず、今までのアプリは配列をそのまま保存して凌いでいました。しかし、とうとうデータベースがないと作れないアプリを作りたくなってしまったので挑戦してみました。自分で何度でも再現できるようにここに手順を書き残して置きたいと思います。

他にも主キーの設定やインデックスを作るなどいろんなことができるようですが、シンプルにデータを管理するためだけであれば本当に簡単に使えそうでこれからのアプリ開発が楽になりそうです。