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