首页 > 解决方案 > Android 领域数据随机丢失/损坏

问题描述

Realm 数据库的行为很奇怪,因为在使用应用程序的不同时间(通常是打开后),执行查询后,尽管数据库中的数据存在,但我们得到 null。数据库文件无法在realm studio中打开,数据库中是否存在数据由hexeditor确认。加密和非加密数据库也是如此。

在给定的示例中,我在登录后保存用户实体。每次打开应用程序时,我都必须获取用户数据,这就是问题出现的地方,因为有时会发生数据库返回 null 等情况,直到我完全删除应用程序。

了解更多信息:

这是代码,也许有人会有想法?

private fun initRealm(application: Application) {
     Realm.init(application).also {
         getAppSharedPreferences().run {
             getSharedValue<ByteArray>("RealmKey").let { key ->
                 if (key == null) {
                     val newKey = ByteArray(64)
                     val random: Random = SecureRandom()
                     random.nextBytes(newKey)
                     putSharedValue("RealmKey", newKey)
                     newKey
                 } else {
                     key
                 }
             }
         }.also { key ->
             RealmConfiguration.Builder()
                 .name("AppNameRealmDB.realm")
                 .encryptionKey(key)
                 .allowQueriesOnUiThread(false)
                 .allowWritesOnUiThread(false)
                 .schemaVersion(1)
                 .migration(AppRealmMigrations())
                 .build().run {
                     Realm.setDefaultConfiguration(this)
                 }
         }
     }
 }
class UnitOfWork {
    fun <TResult> queryRealm(action: Realm.() -> TResult): Single<TResult> {
        return Single.create<TResult> { emitter ->
            Realm.getDefaultInstance().run {
                try {
                    emitter.onSuccess(action.invoke(this)!!)
                } catch (ex: Exception) {
                    close()
                    emitter.onError(ex)
                } finally {
                    close()
                }
            }
        }.subscribeOn(Schedulers.io())
    }
}
class CurrentUserHelper(private val unitOfWork: UnitOfWork) {
    
    //This fun is sample original user entity comes after login request
    fun saveCurrentUser(): Single<OperationResult> {
        return unitOfWork.queryRealm {
            executeTransaction {
                copyToRealmOrUpdate(UserEntity().apply {
                    isCurrentUser = true
                })
            }
        }.map {
            OperationResult.Success()
        }
    }

    fun getCurrentUser(): Single<UserEntity> {
        return unitOfWork.queryRealm {
            copyFromRealm(
                where(UserEntity::class.java).equalTo(
                    UserEntity::isCurrentUser.name,
                    true
                ).findFirst()!! <-- Null pointer exception
            )
        }
    }
}
fun clear(): Single<OperationResult> {
        return unitOfWork.queryRealm {
            executeTransaction {
                where(UserEntity::class.java).findAll().deleteAllFromRealm()
            }
        }.map {
            OperationResult.Success()
        }
    }
@RealmClass
open class UserEntity() : RealmModel {
    @PrimaryKey
    var id: String = UUID.randomUUID().toString()

    var isCurrentUser: Boolean = false
}

https://github.com/realm/realm-java/issues/7549

标签: androiddatabaserealm

解决方案


推荐阅读