最終更新日: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 )を触っています。
趣味でギター弾きます。




