【问题标题】:Room: how to check whether row existsRoom:如何检查行是否存在
【发布时间】:2018-12-10 21:32:36
【问题描述】:

在我的存储库类中,我只想在 Room 表中不存在数据时才获取数据。如何检查表中是否存在任何行?

【问题讨论】:

  • 我不知道在房间里是否有一种优雅的方式。但是您可以查询该行并检查 null 结果。或者您可以使用COUNT()。如果不存在行,计数将为 0。
  • 如果你的 DAO 的 Rx 为 interface MyDao { @Query("SELECT * FROM myTable") fun getAllEntries() : Single<List<Entries>>,然后在你的 repo 中你可以有一个 flatMap{ if (it.isEmpty()) { .. } else { .. } } 用于操作数据结构的订阅调用

标签: android kotlin android-room


【解决方案1】:

使用EXISTS运算符,返回1表示true,0表示false

如果您想检查某些特定行和某些条件,请执行以下操作:

@Query("SELECT EXISTS(SELECT * FROM tableName WHERE id = :id)")
fun isRowIsExist(id : Int) : Boolean

或者简单地使用这个:

@Query("SELECT EXISTS(SELECT * FROM tableName)")
fun isExists(): Boolean

【讨论】:

  • 看起来你已经发布了正确的答案,但没有得到足够的支持。
【解决方案2】:

您可以使用EXISTS 运算符并只返回Boolean

@Query("SELECT EXISTS(SELECT * FROM table)")
fun hasItem(): Boolean

【讨论】:

  • 能否提供更多详细信息如何使用此解决方案?
【解决方案3】:

正如 ADM 建议的那样,您可能会很幸运地使用 COUNT() 来计算表中的实际行数。

但是,我建议无论如何都只获取数据 - 如果不存在 Room 将简单地返回一个空列表,这不应该比询问行数效率低(如果它仍然是 0)。

另外,您可以编写更少的代码来获得您想要的功能! :-)

【讨论】:

  • 问题是,如果我要一个 RxJava Observable,如果不存在就不会发生任何事情
  • 你不必使用Observable,你可以使用SingleMaybe
  • 但是如果我的表中有很多记录,“EXISTS”查询将比获取所有内容更有效。
  • @mreichelt,如果函数的返回类型是非空 pojo 类型并且行不存在会发生什么。
  • @SouravKannanthaB 如果该行不存在,它仍然会返回一个空列表,无论 pojo 是否可以为空。它不会返回一个空列表,只是一个空列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2019-12-29
  • 2016-12-05
  • 2014-10-02
  • 1970-01-01
相关资源
最近更新 更多