是否可以检查 Flow 是否发回一个值,如果没有发回则对其采取行动?
override suspend fun insertUserResponse(userResponse: UserResponse) {
val userResponseFromBDD: Flow<UserResponse>? = userResponseDAO.searchUserByToken(userResponse.profilePOJO.uniqueID)
userResponseFromBDD?.collect {
userResponseDAO.updateUser(userResponse)
} ?: {
userResponseDAO.insertUser(userResponse)
}
}
最佳答案
几点说明:
- 有两种类型的查询 - 一次性查询和流式查询。对于您的用例,您需要一次性查询(使用
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)
}
通过 Flow,您可以获得流,只要数据库中的数据更新,它就会发出值。这就是为什么在您的用例中您可以在循环中获取值:您从
searchUserByToken
获取值 value -> 你更新值 -> 你得到新值,因为 Room 使用 Flow 并调用searchUserByToken
再次 -> 你更新值 -> ...如果您使用 Room 的
@Insert(onConflict = OnConflictStrategy.REPLACE)
您不能检查 userResponse 是否在数据库中而仅使用insertUser
方法(因为如果用户在数据库中插入会导致其更新)
关于android - Kotlin Flow - 可为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64322363/