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);