Необязательные параметры запроса не работают с комнатой

Допустим, у нас есть следующая запись в базе данных:

@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:) равен нулю, Room преобразует этот запрос во что-то вроде этого:

SELECT * FROM dogs WHERE breed = NULL

К сожалению, для SQLite запрос нулевых значений должен выглядеть так:

SELECT * FROM dogs WHERE breed IS NULL

Вопрос в том, как определить запрос, который принимает необязательные параметры?


person Nominalista    schedule 22.11.2019    source источник


Ответы (1)


Вы должны проверить операторы 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>
}
person Giorgos Neokleous    schedule 22.11.2019
comment
Спасибо, это то, что я хотел. - person Nominalista; 22.11.2019