Kotlin Flow - 可空值

Kotlin Flow - Nullable value

是否可以检查 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. 查询有两种类型 - one-shot 和流。对于您的 use-case,您需要 one-shot 查询(使用 searchUserByToken 获取响应或 null 一次,以及一次 - 插入或更新值)。对于 Room 中的 one-shot 查询,您可以使用没有 Flow:
  2. 的挂起函数
@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,您可以获得流,只要在数据库中更新数据,它就会发出值。这就是为什么在你的 use-case 中你可以在循环中获取值:你从 searchUserByToken 获取值 -> 你更新值 -> 你获得新值,因为 Room 使用 Flow 并再次调用 searchUserByToken - > 你更新值 -> ...

  2. 如果你使用 Room 的 @Insert(onConflict = OnConflictStrategy.REPLACE) 你不能检查 userResponse 是否在数据库中并且只使用 insertUser 方法(因为如果用户在数据库中插入会导致它更新)