SwiftでRealmを使う
はじめに
アプリ内にデータを永続化させる方法として内部的にsqlite3を使うCoreDataは素で使うのはけっこう大変、 CoreDataのORMのライブラリMagicalRecordやSugarRecordを使う方法もある。
RealmはSqlite3ではない高速なDBと、ORMがコミコミで使い方を簡単も簡単(らしい)
Android, iOS含めデファクトスタンダードになるつつあるRealmを使ってみる
ゴール
- Realmをプロジェクトに含めて設定する
- Realmを使って読み込み・書込する
動作環境
※プロジェクトの設定等はこちらの記事を参照 http://konyu.hatenablog.com/entry/2016/05/20/192759
CarthageでRealmを追加し、プロジェクトで使用可能にする
iOS向けのライブラリをCarthageを利用して取得する
コンソールからXcodeプロジェクトのディレクトリに行きCartfileに以下を追記する
github "realm/realm-cocoa"
Carthageを利用してライブラリのバイナリを取得する
> carthage update --platform iOS realm-cocoa
Xcodeプロジェクトルート/Carthage/Build/iOS の下に書きファイルが作成されていればOK
- Realm.framework
- RealmSwift.framework
※ realm-cocoaとライブラリ名を指定してあげないと、Carthageに書いてあるすべてのライブラリを更新使用してしまうので注意が必要
--platformでiOSを指定してもrealmの場合はBuildディレクトリに各プラットフォームにコンパイル済みのRealm.frameworkやRealmSwift.frameworkが作成される。 --no-use-binariesオプションをつけるとソースからコンパイルする このへんはCarthageというよりは各ライブラリのCarthage向けの設定の問題かもしれない
XcodeプロジェクトにRealmのライブラリを紐づける
Xcodeでプロジェクトを起動しプロジェクトファイルを開き、Generalを選択、Embedded Binariesに先ほど作った
- Realm.framework
- RealmSwift.framework
を追加する
次に、プロジェクトファイルのBuild Phasesを選択、Run ScriptのInut Filesに以下を追記する
$(SRCROOT)/Carthage/Build/iOS/Realm.framework $(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework
コンパイルが通ったら成功
Realmを使って書き込み・読み取りをする
Realm browserをインストール
書き込みの確認のためにRealm browserをインストールする https://itunes.apple.com/app/realm-browser/id1007457278
Realmモデル作成の準備
XcodeのパッケージマネージャAlcatrazのインストール
HomebrewのようなXcode向けのパッケージマネージャAlcatrazをインストールする http://alcatraz.io/
コンソールから下記の実行して、xcodeを再起動する
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
WindowメニューにPackege Manegerの項目が増えていたら成功
RealmPluginをインストールする
先ほど入れたAlcatrazを利用するためにXcodeのWindowメニューPackege Manegerを開く Searchのウインドウに「RealmPlugin」と入れて検索してヒットしたRealmPluginをインストールボタンを押してインストールする インストールが完了したらXcodeを再起動し、新規ファイル追加するメニューに「Realm」があり、その中に「Realm Model Object」が選択できるようになっている
Realmモデルの作成
新しいファイルから「Realm Model Object」を選択しクラス名をRealmTestとする
import Foundation import RealmSwift class RealmTest: Object { // dynamic修飾子を付けないとあかん、なぜかは説明を読んでも説明に見がわからんので、今のところおまじない dynamic var name = "" dynamic var number = 0 // Specify properties to ignore (Realm won't persist these) // override static func ignoredProperties() -> [String] { // return [] // } }
Realmで書き込みをする
アプリ起動時に実行するViewController.swiftのviewDidLoadメソッドに追記する シミュレータを起動して書き込みを行う
import UIKit import RealmSwift class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // モデル作成 let myRealm = RealmTest(value: ["name" : "なまえ", "number": 100]) // デフォルトRealmを取得する(おまじない) let realm = try! Realm() // トランザクションを開始して、オブジェクトをRealmに追加する try! realm.write { realm.add(myRealm) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
Realm browserで書き込みを確認する
Realmで書き込まれれると default.realmファイルというものに書き込まれる。 (たぶんdefault以外にもファイル名を変えられたり複数ファイルを使ったり出来るんだろうがそれはまた別のお話)
Realm browserからシミュレータにあるrealmファイルを開く
realmファイルの場所については以下の記事が詳しいく書いてある http://stackoverflow.com/questions/28465706/how-to-find-my-realm-file/28465803#28465803
Realm browserを起動して、ダイアログでrealmファイルの場所を指定する際には、「Cmd + shift + g」で絶対パスを利用すると便利 /Users/ユーザ名/Library/Developer/CoreSimulator/Devices/デバイスID/data/Containers/Data/Application/アプリID/Documents/default.realm
このように書き込まれているのを確認できる。
Realmで読み取りをする
書き込みをしたコードの直下に、読み取り部分のコードを追加する
import UIKit import RealmSwift class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // モデル作成 let myRealm = RealmTest(value: ["name" : "なまえ", "number": 100]) // デフォルトRealmを取得する(おまじない) let realm = try! Realm() // トランザクションを開始して、オブジェクトをRealmに追加する try! realm.write { realm.add(myRealm) } // 追記 読み取り部分////// let objs = realm.objects(RealmTest).filter("number == 100") if let obj = objs.first { print(obj) } // 追記終わり } }
コンソール画面にprint出力した結果が表示される。
RealmTest { name = なまえ; number = 100; }
refs: https://realm.io/jp/docs/swift/latest/
本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応 黒帯エンジニアがしっかり教える基本テクニック (ヤフー黒帯シリーズ)
- 作者: 西磨翁
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/27
- メディア: Kindle版
- この商品を含むブログを見る