Я думаю, что я решаю проблему, создавая новый экземпляр Realm каждый раз, когда мне нужно сделать запрос.
Я превратил свою личную функцию в эту
private fun getUserIfExist(db: Realm, email: String): UserModel? {
return db.where(UserModel::class.java).equalTo("email", email).findFirst()
}
Я создал новую приватную функцию для удаления
private fun deleteInDb(db: Realm, email: String) {
db.executeTransactionAsync {
it.where(UserModel::class.java)
.equalTo("email", email)
.findFirst()
}
}
Чтобы записать в таблицу, я тоже создал приватную функцию
private fun writeToDB(entityToken: EntityToken, email: String): String? {
realm = Realm.getDefaultInstance()
realm.executeTransactionAsync { bgRealm ->
var user = findInDb(bgRealm, email)
if (user != null) {
deleteInDb(bgRealm, email)
}
user = bgRealm.createObject(UserModel::class.java, UserModel.cachedNextId)
user!!.email = email
user.token = entityToken.token
user.refreshToken = entityToken.refresh_token
user.logged = true
}
realm.close()
return entityToken.refresh_token
}
И наконец моя функция doLogin стала
override fun doLogin(email: String, password: String) {
apiService.loginCheck(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.computation())
.map {
// write to DB
writeToDB(it, email, password)
return@map it
}
.flatMap { ping ->
//doPing to refresh token if not success
if (!ping.success) {
}
return@flatMap apiService.userInfoFromServer
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ uR ->
updateUserInfo(uR, email)
}, { error ->
Log.e("tt", error.message)
})
}
}
Это работает, но у меня есть другая проблема. Тот факт, что я посылаю только Realm Object, поэтому, когда я объявил
realm = Realm.getDefaultInstance()
Это изменило мое имя базы данных RealmConfiguration на имя по умолчанию
Любое решение приветствуется!