Android Room - выбор запроса с помощью LIKE

Я пытаюсь выполнить запрос для поиска всех объектов, чьи имена содержат текст:

@Query("SELECT * FROM hamster WHERE name LIKE %:arg0%")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

Сообщения:

Error:no viable alternative at input 'SELECT * FROM hamster WHERE name LIKE %'
Error:There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (near "%": syntax error)
Error:Unused parameter: arg0

Также я пытаюсь:

@Query("SELECT * FROM hamster WHERE name LIKE '%:arg0%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

Сообщения:

Error:Unused parameter: arg0

Как это исправить?

Ответы

Ответ 1

Вы должны заключить символы % в свой входной запрос, а не в сам запрос.

например. попробуйте следующее:

@Query("SELECT * FROM hamster WHERE name LIKE :arg0")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

Затем ваше значение String search должно выглядеть так:

search = "%fido%";
loadHamsters(search);

Кроме того, имя параметра привязки должно соответствовать имени переменной, поэтому вместо arg0 оно должно выглядеть так:

@Query("SELECT * FROM hamster WHERE name LIKE :search")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

Ответ 2

Вы можете просто выполнить конкатенацию, используя конкатенацию строк SQLite.

@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

Ответ 3

Room поддерживает только именованный параметр связывания : имя, чтобы избежать путаницы между параметрами метода и параметрами связывания запроса.

Room автоматически свяжет параметры метода с аргументами bind. Это делается путем сопоставления имени параметров с именем аргументов привязки.

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);