LoginSignup
2
0

More than 5 years have passed since last update.

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

Posted at

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を見つけたので質問してみる
image.png

一瞬で返答が。。
image.png
日本語で良かったのか

いくつかやりとりして。。。
image.png

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

ということで

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

5.解明

そして...

image.png

治りました!

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

6.まとめ

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0