【问题标题】:Kotlin Flow - Nullable valueKotlin Flow - 可空值
【发布时间】:2020-10-12 17:13:52
【问题描述】:

是否可以检查 Flow 是否发回了一个值,如果没有则对其进行操作?

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

【问题讨论】:

    标签: android android-room androidx kotlin-flow


    【解决方案1】:

    几点说明:

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

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

    【讨论】:

    • 非常感谢您所做的一切!它真的帮助我更好地理解 Flow!另外,感谢您编辑我的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2020-03-05
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多