Realm
swift4

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

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のカラム定義を変更した際には、マイグレーション設定の追加が必要

・色々なコミュニティに質問しまくればなんとかなる

・コミュニティって素晴らしい。今後は貢献しよう。