Nom*_*sta 2 android kotlin android-room android-jetpack
假设我们有以下数据库条目:
@Entity
data class Dog(
@ColumnInfo(name = "name") val name: String,
@ColumnInfo(name = "breed") val breed: String?
)
Run Code Online (Sandbox Code Playgroud)
如您所见,并非每只狗都有定义的品种。现在我们要进行查询以根据品种搜索所有狗。
@Dao
interface DogDao {
@Query("SELECT * FROM dogs WHERE breed = :breed")
fun getByBreed(breed: String?): List<Dog>
}
Run Code Online (Sandbox Code Playgroud)
有时我们想搜索特定品种的狗,有时我们想搜索没有定义品种的狗。问题是在第二种情况下,上面的查询不起作用。为什么?当方法中的breed
参数getByBreed(breed:)
为空时,Room 会将此查询转换为如下内容:
SELECT * FROM dogs WHERE breed = NULL
不幸的是,SQLite 查询空值应该是这样的:
SELECT * FROM dogs WHERE breed IS NULL
问题是,如何定义一个接受可选参数的查询?
您应该查看 SQLite 运算符。直接取自此链接。
IS 和 IS NOT 运算符的工作方式与 = 和 != 类似,除非其中一个或两个操作数为 NULL。在这种情况下,如果两个操作数都为 NULL,则 IS 运算符的计算结果为 1(真),IS NOT 运算符的计算结果为 0(假)。如果一个操作数为 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>
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
545 次 |
最近记录: |