可选查询参数不适用于Room

时间:2019-11-22 10:30:52

标签: android kotlin android-room android-jetpack

假设我们有以下数据库条目:

@Entity
data class Dog(
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "breed") val breed: String?
)

如您所见,并非每只狗都有定义的品种。现在,我们要进行查询以根据狗的品种搜索所有狗。

@Dao
interface DogDao {

    @Query("SELECT * FROM dogs WHERE breed = :breed")
    fun getByBreed(breed: String?): List<Dog>
}

有时我们想搜索具有特定品种的狗,有时我们想搜索没有定义品种的狗。问题在于,在第二种情况下,上述查询将不起作用。为什么?当breed方法中的getByBreed(breed:)参数为空时,会议室会将此查询转换为以下内容:

SELECT * FROM dogs WHERE breed = NULL

不幸的是,对于SQLite,查询空值应如下所示:

SELECT * FROM dogs WHERE breed IS NULL

问题是,如何定义一个接受可选参数的查询?

1 个答案:

答案 0 :(得分:3)

您应该签出SQLite运算符。直接从此link中获取。

  

IS和IS NOT运算符的工作方式类似于=和!=,除非其中一个或两个操作数均为NULL。在这种情况下,如果两个操作数均为NULL,则IS运算符的计算结果为1(true),而IS NOT运算符的计算结果为0(false)。如果一个操作数为NULL而另一个操作数为NULL,则IS运算符的计算结果为0(假),而IS NOT运算符的计算结果为1(真)。 IS或IS NOT表达式无法计算为NULL。运算符IS和IS NOT的优先级与=相同。

因此,您应该拥有的将与您拥有的等同:

@Dao
interface DogDao {
    @Query("SELECT * FROM dogs WHERE breed IS :breed")
    fun getByBreed(breed: String?): List<Dog>
}