Android 可选查询参数不适用于文件室
假设我们有以下数据库条目:Android 可选查询参数不适用于文件室,android,kotlin,android-room,android-jetpack,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
@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>
}
@Dao
接口道{
@查询(“从狗中选择*,其中繁殖=:繁殖”)
有趣的GetBybride(品种:字符串?):列表
}
有时我们想搜索特定品种的狗,有时我们想搜索没有定义品种的狗。问题是,在第二种情况下,上述查询将不起作用。为什么?当getbybride(breed:)
方法中的breed
参数为空时,文件室会将此查询转换为如下内容:
从繁殖为空的狗中选择*
不幸的是,对于SQLite,查询空值应该如下所示:
从品种为空的狗中选择*
问题是,如何定义接受可选参数的查询?您应该检查SQLite操作符。直接取自此 “是”和“不是”操作符的工作方式类似于=和!=除非一个或两个操作数都为空。在这种情况下,如果两个操作数都为NULL,则IS运算符的计算结果为1(true),而IS NOT运算符的计算结果为0(false)。如果一个操作数为NULL,另一个为非NULL,则is运算符的计算结果为0(false),而is not运算符的计算结果为1(true)。is或is not表达式的计算结果不可能为NULL。运算符的优先级与= 因此,您应该拥有并将等同于您拥有的是:
@Dao
interface DogDao {
@Query("SELECT * FROM dogs WHERE breed IS :breed")
fun getByBreed(breed: String?): List<Dog>
}
@Dao
接口道{
@查询(“从品种为:品种的狗中选择*)
有趣的GetBybride(品种:字符串?):列表
}
谢谢,这正是我想要的。