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)
}
}
几点说明:
- 查询有两种类型 - one-shot 和流。对于您的 use-case,您需要 one-shot 查询(使用
searchUserByToken
获取响应或 null 一次,以及一次 - 插入或更新值)。对于 Room
中的 one-shot 查询,您可以使用没有 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,您可以获得流,只要在数据库中更新数据,它就会发出值。这就是为什么在你的 use-case 中你可以在循环中获取值:你从 searchUserByToken
获取值 -> 你更新值 -> 你获得新值,因为 Room 使用 Flow 并再次调用 searchUserByToken
- > 你更新值 -> ...
如果你使用 Room 的 @Insert(onConflict = OnConflictStrategy.REPLACE)
你不能检查 userResponse 是否在数据库中并且只使用 insertUser
方法(因为如果用户在数据库中插入会导致它更新)
是否可以检查 Flow 是否发回一个值并在没有发回时对其采取行动?
override suspend fun insertUserResponse(userResponse: UserResponse) {
val userResponseFromBDD: Flow<UserResponse>? = userResponseDAO.searchUserByToken(userResponse.profilePOJO.uniqueID)
userResponseFromBDD?.collect {
userResponseDAO.updateUser(userResponse)
} ?: {
userResponseDAO.insertUser(userResponse)
}
}
几点说明:
- 查询有两种类型 - one-shot 和流。对于您的 use-case,您需要 one-shot 查询(使用
searchUserByToken
获取响应或 null 一次,以及一次 - 插入或更新值)。对于Room
中的 one-shot 查询,您可以使用没有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,您可以获得流,只要在数据库中更新数据,它就会发出值。这就是为什么在你的 use-case 中你可以在循环中获取值:你从
searchUserByToken
获取值 -> 你更新值 -> 你获得新值,因为 Room 使用 Flow 并再次调用searchUserByToken
- > 你更新值 -> ...如果你使用 Room 的
@Insert(onConflict = OnConflictStrategy.REPLACE)
你不能检查 userResponse 是否在数据库中并且只使用insertUser
方法(因为如果用户在数据库中插入会导致它更新)