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

Як це виправити?

Відповіді:


142

Ви повинні вкладати %символи у вхідний запит, а не в сам запит.

Наприклад, спробуйте це:

@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
Зверніть увагу, що наразі в обробці анотацій Котліна
Кирило

@KirillRakhman, але цей метод все ще працює нормально ;-) stackoverflow.com/a/44448566/6674369
Андрій Антонов,

@AndriyAntonov помилку Kotlin було виправлено 9 місяців тому
Кирило Рахман,

307

Ви можете просто конкатувати, використовуючи конкатенацію рядків SQLite.

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

1
працювати навіть з помилкою kotlin: youtrack.jetbrains.com/issue/KT-17959
Андрій Антонов,

7
Такий підхід насправді і вимагав питання. Хоча й інша відповідь теж непогана.
xarlymg89

Я розумію, '%'але хтось може пояснити, що таке '||'і чому?
Алі Казі

15
||є оператором об'єднання рядків. Подумайте про це, як +у Java String.
Sanlok Lee

приголомшлива відповідь. Щиро дякую.
reza_khalafi

0

Кімната підтримує лише іменований параметр прив'язки : ім'я, щоб уникнути плутанини між параметрами методу та параметрами прив'язки запиту.

Кімната автоматично прив’яже параметри методу до аргументів прив’язки. Це робиться шляхом зіставлення імені параметрів з ім'ям аргументів прив'язки.

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.