前提・実現したいこと
kotlinでandroid開発をしています。
MVVMでプロフィール画面を作成しており、ローカルのキャッシュとしてRealmを使用しています。
プロフィールを更新した際はrealmのentityをdelete→storeして、値を表示する際はfetchを行う画面を作成したいです。
RealmインスタンスはコルーチンのDispatchers.IOで呼んでいます。
発生している問題・エラーメッセージ
具体的にエラーが発生しているわけではありませんが、下記のようにログを出しています。
entityの古い値「長谷川a」をdeleteし、新しい値「長谷川b」をstoreし、その後何度かfetchをしていると、削除されたはずの「長谷川a」がthreadによっては取れてしまいます。
なぜこのような挙動になるのか理解できません。
2021-01-14 13:12:59.181 24418-24636/xxxxxxxx E/hasegawa: fetch長谷川a
2021-01-14 13:13:00.305 24418-24636/xxxxxxxx E/hasegawa: fetch長谷川a
2021-01-14 13:13:04.778 24418-24638/xxxxxxxx E/hasegawa: delete長谷川a
2021-01-14 13:13:05.699 24418-24638/xxxxxxxx E/hasegawa: store長谷川b
2021-01-14 13:13:06.616 24418-24638/xxxxxxxx E/hasegawa: fetch長谷川b
2021-01-14 13:13:10.097 24418-24638/xxxxxxxx E/hasegawa: fetch長谷川b
2021-01-14 13:13:11.178 24418-24638/xxxxxxxx E/hasegawa: fetch長谷川b
2021-01-14 13:13:18.593 24418-24638/xxxxxxxx E/hasegawa: fetch長谷川b
2021-01-14 13:13:19.787 24418-24638/xxxxxxxx E/hasegawa: fetch長谷川b
2021-01-14 13:13:20.774 24418-24638/xxxxxxxx E/hasegawa: fetch長谷川b
2021-01-14 13:13:21.591 24418-24636/xxxxxxxx E/hasegawa: fetch長谷川a
2021-01-14 13:13:22.543 24418-24636/xxxxxxxx E/hasegawa: fetch長谷川a
2021-01-14 13:13:23.364 24418-24636/xxxxxxxx E/hasegawa: fetch長谷川a
該当のソースコード
kotlin + Android Studioを使用
下記Store、Fetch、DeleteをCoroutineScopeで(Dispatchers.IO)利用
Store時の動作
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
val entity = AccountProfileEntity(accountProfile)
it.copyToRealmOrUpdate(entity)
}
Delete時の動作
val realm = Realm.getDefaultInstance()
val entity = realm.where(AccountProfileEntity::class.java).findFirst()
realm.executeTransaction {
entity?.deleteFromRealm()
}
Fetch時の動作
val realm = Realm.getDefaultInstance()
val instance = realm.where(AccountProfileEntity::class.java).findFirst()
return instance?.toModel()
プロフィール取得機能
override suspend fun getProfile(isForce: Boolean): AccountProfile =
withContext(Dispatchers.IO) {
if (isForce) {
database.delete()
}
val profile = database.fetch() if (profile != null) { return@withContext profile } val token = prefs.getToken() ?: throw NoTokenException val response = service.getProfile(token) database.store(response) response }
試したこと
Realmのバージョンをいくつか変えてみましたが動作は変わりませんでした。
補足情報(FW/ツールのバージョンなど)
Realm Java 10.0.1 Latest
kotlin
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。