【问题标题】:Room - SELECT query, get or defaultRoom - SELECT 查询、获取或默认
【发布时间】:2017-10-26 11:00:47
【问题描述】:

在 SQL Brite 中,有一个方法 mapToOneOrDefault。房间里有类似的东西吗?

为模特说话

@Entity(tableName = "users")
data class User(@PrimaryKey val name: String)

和道

@Dao
interface UserDao {
    @Query("SELECT FROM users where name = :name")
    fun getUserByName(name: String): Flowable<User>
}

如果数据库中没有John,则流不会为getUserByName("John") 返回任何内容。有没有办法获得默认值,比如User("")

【问题讨论】:

标签: android kotlin rx-java2 android-room


【解决方案1】:

如果没有,则流不会为 getUserByName("John") 返回任何内容 数据库中的约翰。有没有办法获得默认值,比如 User("")

没有默认机制。

您可以从 Flowable&lt;User&gt; 更改为 Flowable&lt;List&lt;User&gt;&gt;。如果没有用户,您将得到一个空列表。您可以使用map 来检查并返回默认值或filter+switchIfEmpty

或者您可以从 Flowable 更改为 Single。使用Single,如果没有行,匹配您的查询,onError 将被触发。然后您可以实现onErrorReturnonErrorResumeNext 以返回默认值

【讨论】:

  • 与另一个答案一样,这将在一个值之后结束流,我需要它保持打开状态以进行任何数据库更新
  • 然后,而不是 Flowable&lt;User&gt; 使用 Flowable&lt;List&lt;User&gt;&gt;。如果没有用户,您将获得一个空列表。可以用map来检查决定或者fiter+switchIfEmpty
  • 这似乎是一个合理的做法。谢谢!
【解决方案2】:

在这种情况下,您可以使用Maybe 而不是Flowable

也许:从概念上讲,它是 Single 和 Completable 的结合,提供了捕获发射模式的方法,其中可能存在 0 或 1 个项目或某个反应源发出的错误信号。

如果查询没有返回值,您可以使用运算符 defaultIfEmpty 映射到新对象。

Reference

【讨论】:

  • 但这会在一个值之后结束流,我需要它保持打开状态以进行任何数据库更新
  • 我同意@Blackbelt 在那一点上所说的保持流的正常运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2014-02-04
  • 2014-07-08
  • 2017-03-12
  • 2011-04-28
  • 1970-01-01
相关资源
最近更新 更多