【问题标题】:RoomDB insert stuck when onConflict strategy is set设置冲突策略时,房间数据库插入卡住
【发布时间】: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 注释时,它永远不会完成。我已经在生成的类中设置了断点,beginTransactionendTransaction 在里面都被调用了。 这些在我的源代码中被调用:

    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


    【解决方案1】:

    未完成的原因是authProvider.signedInUserUidBehaviorSubjectflatMapCompletable 直到开始流才完成,在本例中为 signedInUserUid 完成。 将 BehaviorSubject 替换为返回 Observable.just() 的方法,修复了在发出值后完成的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多