1

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

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

1 回答 1

2

几点说明:

  1. 有两种类型的查询 - one-shot 和流。对于您的用例,您需要一次性查询(以 ge 响应或 null 一次searchUserByToken和一次 - 插入或更新值)。对于一次性查询,Room您可以使用不带 no 的挂起函数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,您可以获得流,每当数据库中的数据更新时就会发出值。这就是为什么在你的用例中你可以在循环中获取值:你从searchUserByToken -> 你更新值 -> 你得到新值,因为 Room 使用 Flow 并再次调用searchUserByToken-> 你更新值 -> ...

  2. 如果您使用 Room @Insert(onConflict = OnConflictStrategy.REPLACE),则不能检查 userResponse 是否在 DB 中并仅使用insertUser方法(因为如果用户在 db 中插入会导致更新)

于 2020-10-13T14:27:15.063 回答