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 

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

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

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

 @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>> 

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

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