Realmで管理してるmodelにカラムを追加したら情報が消えたお話


Realmで作ってるmodelの変えたことによって、不具合を引き起こして
Realmにちょっとだけ詳しくなったのお話。

1.そもそもRealmって?
2.現象
3.調査
4.なんとかしようと頑張る
5.解明

1.そもそもRealmって?

モバイルアプリ向けのデータベースです。
実際の用途としては、
・ログインしない状態でのデータの管理
・リアルタイムで管理したいデータの管理
などなどです。
LifeSports(弊社のアプリ)ではログイン前のユーザーでも見れるように、Topの情報に関わる選択(好きなスポーツ)やuser情報などを管理しています。

その他基本的なRealmの操作などは下記のサイトを見ました
https://realm.io/jp/
https://dev.classmethod.jp/smartphone/iphone/start-ios-realm-crud/

2.現象

今回User情報に紐づくPush通知に関わる部分の変更を行いました。
すると、なぜがユーザー情報が取得できておらず、User情報で比較する部分がぐちゃぐちゃになってしまいました。

3.調査

特にエラーが出ていたわけではなかったので、realmのconfig周りを見直すことに...
どうやらRealmで管理しているModelはmigrationをしなければならないらしい。
しかしわからん。。。
問題の下記のコード。どこがおかしいかわかった方いますか?

struct RealmStore {

    private init() {}

    static func setup() {
        self.migrationsForNewVersion()
    }

    private static func migrationsForNewVersion() {
        var config = Realm.Configuration(
            schemaVersion: 10,
            migrationBlock: { migration, oldSchemaVersion in
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~               
                if oldSchemaVersion < 10 {
                    migration.enumerateObjects(ofType: Setting.className(), { (oldObject, newObject) in
                        newObject?["isRemindEvent"] = true
                    })
                }

        })

        config.deleteRealmIfMigrationNeeded = true
        Realm.Configuration.defaultConfiguration = config

        do {
            _ = try Realm()
        } catch let error {
            print(error)
            FirebaseStore.uploadError((error as NSError).debugDescription)
        }
    }
}

4.なんとかしようと頑張る

(いいタイトルが思いつかなかった)
ググってもわからないというかググりようがなかった。。。
そんな中でRealmのslackGroupを見つけたので質問してみる

一瞬で返答が。。

日本語で良かったのか

いくつかやりとりして。。。

deleteRealmIfMigrationNeeded とは?
なんとなく変数名からわかりそうですが、「Migrationするときに元のデータを消す」ってことです。
https://realm.io/docs/swift/latest/api/Classes/Realm/Configuration.html#/s:10RealmSwift0A0C13ConfigurationV06deleteA17IfMigrationNeededSbvp

ということで

        //マイグレーション時に元のデータを消さないように変更
        config.deleteRealmIfMigrationNeeded = false

5.解明

そして...

治りました!

よくよく聞いてみると、以前も同じような問題があった模様。
その時にちゃんと調査すれば良かったんj(ry
まぁ治って良かった。

6.まとめ

・realmのカラム定義を変更した際には、マイグレーション設定の追加が必要
・色々なコミュニティに質問しまくればなんとかなる
・コミュニティって素晴らしい。今後は貢献しよう。