假设我们有以下数据库条目:
@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
问题是,如何定义一个接受可选参数的查询?
答案 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>
}