RealmSwift(レルム)で実装編

最終更新日: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からシミュレータを実行すれば動くようになるはずです。(私はこれで新しいテーブル構造で動作することを確認できました。)

ではでは。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です