Kotlin流-可空值

问题描述

是否可以检查Flow是否发回一个值,如果没有,则对其采取行动?

    override suspend fun insertUserResponse(userResponse: UserResponse) {
        val userResponseFromBDD: Flow<UserResponse>? = userResponseDAO.searchUserByToken(userResponse.profilePOJO.uniqueID)

        userResponseFromBDD?.collect {
            userResponseDAO.updateUser(userResponse)
        } ?: {
            userResponseDAO.insertUser(userResponse)
        }
    }

解决方法

几句话:

  1. 查询有两种类型-单次查询和流查询。对于您的用例,您需要一次性查询(使用searchUserByToken一次生成响应或为null,一次-插入或更新值)。对于Room中的一键式查询,您可以不使用Flow使用暂停功能:
@Query("SELECT * FROM userResponse where id = :id")
suspend fun searchUserByToken(id: Int):UserResponse?

您的带有校验值的代码为:

override suspend fun insertUserResponse(userResponse: UserResponse) {
    val userResponseFromBDD = userResponseDAO.searchUserByToken(userResponse.profilePOJO.uniqueID)
    userResponseFromBDD?.let { userResponseDAO.updateUser(userResponse)} 
      ?: userResponseDAO.insertUser(userResponse)
}
  1. 使用Flow,您将获得流,每当在DB中更新数据时,该流就会发出值。这就是为什么在用例中可以循环获取值的原因:您可以从searchUserByToken 获取值->更新值->您可以获取新值,因为Room使用Flow并再次调用searchUserByToken->您更新值-> ...

  2. 如果您使用Room的@Insert(onConflict = OnConflictStrategy.REPLACE),则无法检查userResponse是否在数据库中,而仅使用insertUser方法(因为如果用户在数据库中,则插入将导致更新)