【发布时间】:2020-07-13 14:11:14
【问题描述】:
实体:
@Entity(tableName = "users_table")
data class User(
@PrimaryKey val id: String,
val name: String = "",
val surname: String = "",
val email: String = "",
val phone: String = "",
val likes: List<String> = listOf()
)
道:
@Dao
abstract class UsersDao {
@Query("SELECT * FROM users_table WHERE id=:uid")
abstract fun observeUser(uid: String): Observable<User>
@Query("SELECT * FROM users_table WHERE id=:uid")
abstract fun selectUser(uid: String): Single<User>
@Insert
abstract fun insertUser(user: User): Completable
@Update
abstract fun updateUser(user: User): Completable
}
当我第一次拨打insertUser 时,它没有问题。当我第二次调用它时,它会抛出一个错误,因为数据库中存在冲突,这是@PrimaryKey 的原因。当我将 onConflict=OnCoinflictStrategy.REPLACE 添加到 @Insert 注释时,它永远不会完成。我已经在生成的类中设置了断点,beginTransaction 和 endTransaction 在里面都被调用了。
这些在我的源代码中被调用:
override fun fetchUser(): Completable =
authProvider.signedInUserUid
.flatMap { apiService.getUser(it) }
.flatMapCompletable { usersDao.insertUser(it) }
.doOnError { Timber.e(it) }
.onErrorComplete()
.observeOn(Schedulers.io())
.subscribeOn(Schedulers.io())
更新:当flatMapCompletable 完成时,它不会继续。为什么?当我模拟并返回Completable.error() 并链接onErrorComplete 时,它会按预期继续。当onErrorComplete 被删除时,它以预期的错误结束。为什么完成后不继续? fetchUser 在视图模型中订阅的另一个 rx 方法中被调用:
override fun isSignedIn(): Completable =
currentUserExists()
.andThen(Completable.defer { fetchUser() })
.onErrorResumeNext {
Timber.d("Failed initial $it")
when (it) {
is SignInException -> signInAnonymously()
is NoInternetConnection -> Completable.error(it)
else -> throw NotImplementedError("${it::class.java.name} no implemented")
}
}
【问题讨论】:
标签: android kotlin rx-java android-room