android - Android 领域数据随机丢失/损坏
问题描述
Realm 数据库的行为很奇怪,因为在使用应用程序的不同时间(通常是打开后),执行查询后,尽管数据库中的数据存在,但我们得到 null。数据库文件无法在realm studio中打开,数据库中是否存在数据由hexeditor确认。加密和非加密数据库也是如此。
在给定的示例中,我在登录后保存用户实体。每次打开应用程序时,我都必须获取用户数据,这就是问题出现的地方,因为有时会发生数据库返回 null 等情况,直到我完全删除应用程序。
了解更多信息:
- Realm gradle 插件版本 10.7.1
- 应用程序不断地每 5 秒读取/写入另一个数据
- 对于每个事务,都有与数据库的新连接,并且在之后关闭。
- 我从数据库中删除用户实体的唯一一个地方是注销后
- 迁移为空
- 任何地方都没有像“删除数据库文件”这样的东西
这是代码,也许有人会有想法?
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
}
解决方案
推荐阅读
- sql - SQL 将行连接到变量
- sql - Oracle 中的“Timestamp with Time Zone”类型保留时区格式
- php - 在 Laravel 中执行测试后删除插入的行
- javascript - 如何从函数返回 fetch API 结果?
- javascript - 如何使用 Vue.js 在另一个函数中添加一个函数
- eclipse - 如何将 JavaFx 项目转换为 Gradle 项目?
- php - 使用 php 将 ajax 数据表保存回数据库
- c# - 在 await Task.WhenAll() 中隔离异常
- python - 使用 PyCharm 进行零件调试?
- android-layout - 具有固定宽度但高度的 ImageView 的滑动缩略图 wrap_content