几点说明:
- 有两种类型的查询 - 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)
}
使用 Flow,您可以获得流,每当数据库中的数据更新时就会发出值。这就是为什么在你的用例中你可以在循环中获取值:你从searchUserByToken
-> 你更新值 -> 你得到新值,因为 Room 使用 Flow 并再次调用searchUserByToken
-> 你更新值 -> ...
如果您使用 Room @Insert(onConflict = OnConflictStrategy.REPLACE)
,则不能检查 userResponse 是否在 DB 中并仅使用insertUser
方法(因为如果用户在 db 中插入会导致更新)