最終更新日:2017‐04-28
前回、プロジェクトのセットアップが終わったので、中身を実装します。
「Realm Browser」のインストール
とその前に、便利なツールをインストールしておきましょう。
Realm公式のツールです。データベースの中身を確認できます。
https://itunes.apple.com/jp/app/realm-browser/id1007457278?mt=12
データを挿入するプログラムの実装
まずは、テーブルレイアウトの元になるクラスを作成します。
// // Person.swift // DemoRealm // import Foundation import RealmSwift class Person: Object { dynamic var name = "" dynamic var age = 0 dynamic var sex = "" dynamic var birthday = "" dynamic var genre = "" }
次に「ViewController」
// // ViewController.swift // DemoRealm // import UIKit import RealmSwift class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let realm = try! Realm() let a_guitarist = Person() a_guitarist.name = "Paul Guilbert" a_guitarist.age = 50 a_guitarist.sex = "MALE" a_guitarist.birthday = "1966-11-06" a_guitarist.genre = "HR/HM" try! realm.write() { realm.add(a_guitarist) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
コンパイルが通ったら、シミュレータで起動してみます。
一通り流れたら、realmのデータベースファイル「default.realm」が作成されているはずですので、ターミナルで探してみます。
ターミナルで以下のコマンドを打ちます。
find /Users/ -name default.realm -ls 19389704 8 -rw-r--r-- 1 hoge staff 4096 4 27 22:31 /Users//hoge/Library/Developer/CoreSimulator/Devices/8D7F0311-0F41-4552-B185-E8CEE6C28758/data/Containers/Data/Application/EAC6EBC8-94BC-4E01-9E0F-77CF3C37C711/Documents/default.realm find: /Users//hoge/Library/Saved Application State/com.bitrock.appinstaller.savedState: Permission denied
※「Permission denied」のところはアクセス権限がないだけなので無視します。
/Users//hoge/Library/Developer/CoreSimulator/Devices/8D7F0311-0F41-4552-B185-E8CEE6C28758/data/Containers/Data/Application/EAC6EBC8-94BC-4E01-9E0F-77CF3C37C711/Documents/default.realm
にファイルができていることがわかったので、チェンジディレクトリしておきます。
cd /Users//hoge/Library/Developer/CoreSimulator/Devices/8D7F0311-0F41-4552-B185-E8CEE6C28758/data/Containers/Data/Application/EAC6EBC8-94BC-4E01-9E0F-77CF3C37C711/Documents/
そしてさらにターミナルで
open default.realm
と打ちます。
すると、「Realm Browser」をインストール済みであれば、以下の画面が立ち上がります。ファイルが色々グレーアウトされてますが、迷わず右下の「Allow」ボタンをクリックします。
するとどうでしょう。先程動かしたプログラムでデータが挿入されています。
実行エラーになるときは
クラスの構造を変えるとデータベースの構造も変わってしまうので、エラーになってしまいます。今回の場合ですと、「Persion.swift」クラスにプロパティを追加すると発生します。
シミュレータで「EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)」というエラーが出力される場合、コンソールを確認します。
この部分にmigrate(マイグレート)の文字を見つけたら、データベースの構造を変更したためにエラーが発生しています。
fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors: - Property 'Person.birthday' has been added. - Property 'Person.genre' has been added." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: - Property 'Person.birthday' has been added. - Property 'Person.genre' has been added., Error Code=10}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.46.2/src/swift/stdlib/public/core/ErrorType.swift, line 178
私の場合、Personクラスに「birthday」と「genre」プロパティを追加したのでマイグレートしてね。と言われています。
本来はこちらのサイト「http://llcc.hatenablog.com/entry/2015/08/22/183019」
でご紹介頂いているような方法が良いと思いますが、すこし面倒なので、データベースファイルを削除して対応します。
※登録してるデータは消えますのでご注意を。また、ファイルを使用してロックしている可能性もあるので、データファイルを削除する場合は、Realm Browserや、シミュレータが起動している場合を、終了させてからのほうが安全かと思います。
ターミナルから、以下のように「rm -i」で対象のファイルを削除していきます。「dafault.realm.management」はディレクトリなので、「cd」コマンドで移動して配下のファイルも削除しておきます。
$ ls -ltr total 16 drwxr-xr-x 7 hoge staff 238 4 27 22:34 default.realm.management -rw-r--r--@ 1 hoge staff 4096 4 27 23:01 default.realm prw-------@ 1 hoge staff 0 4 27 23:01 default.realm.note -rw-r--r--@ 1 hoge staff 1184 4 27 23:11 default.realm.lock $ rm -i * remove default.realm? y remove default.realm.lock? y rm: default.realm.management: is a directory remove default.realm.note? y $ ls default.realm.management $ cd default.realm.management/ $ ls access_control.balance.mx access_control.new_commit.cv access_control.write.mx access_control.control.mx access_control.pick_writer.cv $ rm -i * remove access_control.balance.mx? y remove access_control.control.mx? y remove access_control.new_commit.cv? y remove access_control.pick_writer.cv? y remove access_control.write.mx? y $ ls
このあと、再度Xcodeからシミュレータを実行すれば動くようになるはずです。(私はこれで新しいテーブル構造で動作することを確認できました。)
ではでは。
技術の進化についていけていないシステムエンジニア。浅く広く、何でも大体はこなせるエンジニアで重宝されてる(つもり)。でもやっぱり特化した武器欲しい。
備忘録として記事を投稿していますが、少しでも誰かの助けになればと思います。
最近はプロジェクトでReact(TypeScript )を触っています。
趣味でギター弾きます。