Android Room - выберите запрос с LIKE

105

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

@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

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

Денис Бузмаков
источник

Ответы:

144

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

Например, попробуйте это:

@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>>
Коди Кофлан
источник
4
Обратите внимание, что в настоящее время существует ошибка с именами параметров при обработке аннотаций Kotlin: youtrack.jetbrains.com/issue/KT-17959
Кирилл Рахман
@KirillRakhman, но этот метод по-прежнему работает нормально ;-) stackoverflow.com/a/44448566/6674369
Андрей Антонов
@AndriyAntonov ошибка Котлина исправили 9 месяцев назад
Кирилл Рахман
311

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

@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
yigit
источник
1
работает даже с котлиновым багом: youtrack.jetbrains.com/issue/KT-17959
Андрей Антонов
7
Этот подход на самом деле является тем, о чем спрашивал вопрос. Хотя и другой ответ тоже неплох.
xarlymg89
Я понимаю, '%'но может ли кто-нибудь объяснить, что это такое '||'и почему?
Али Кази
15
||- оператор конкатенации строк. Думайте об этом как о +Java String.
Санлок Ли,
потрясающий ответ. Огромное спасибо.
reza_khalafi
0

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

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

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);
Свапнил
источник