问题描述
是否可以检查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,您将获得流,每当在DB中更新数据时,该流就会发出值。这就是为什么在用例中可以循环获取值的原因:您可以从
searchUserByToken
获取值->更新值->您可以获取新值,因为Room使用Flow并再次调用searchUserByToken
->您更新值-> ... -
如果您使用Room的
@Insert(onConflict = OnConflictStrategy.REPLACE)
,则无法检查userResponse是否在数据库中,而仅使用insertUser
方法(因为如果用户在数据库中,则插入将导致更新)