android - Kotlin Flow - 可为空值

标签 android android-room androidx kotlin-flow

是否可以检查 Flow 是否发回一个值,如果没有发回则对其采取行动?

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

最佳答案

几点说明:

  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)
}
  • 通过 Flow,您可以获得流,只要数据库中的数据更新,它就会发出值。这就是为什么在您的用例中您可以在循环中获取值:您从 searchUserByToken 获取值 value -> 你更新值 -> 你得到新值,因为 Room 使用 Flow 并调用 searchUserByToken再次 -> 你更新值 -> ...

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

  • 关于android - Kotlin Flow - 可为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64322363/

    相关文章:

    android - 在房间持久库中无法使用 like 子句

    java - Android 支持库不存在但无法编辑 "Build"文件夹下的文件以引用 Android X

    android - 在Android中播放媒体

    java - 如何使 LiveData getValue() 函数返回 Android 中房间数据库中的项目列表?

    android - CoordinatorLayout(AppbarLayout) 无法正确绘制工具栏

    java - 房间一对多警告

    java - ClassNotFoundException:config_inputEventCompatProcessorOverrideClassName androidx,在 andoridx 上运行崩溃

    android - 什么是 AndroidX.Test 框架,它如何影响我的单元/robolectric/espresso 测试?

    android - 有没有办法按英寸指定文件夹布局?

    java - 字符串到字节数组类型转换