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

이 문제를 해결하는 방법?

답변:


143

%쿼리 자체가 아니라 입력 쿼리에서 문자를 묶어야합니다 .

예를 들어 이것을 시도하십시오.

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

@KirillRakhman하지만이 방법은 아직 잘 ;-) 작동 stackoverflow.com/a/44448566/6674369을
안드리 안토 노프

@AndriyAntonov 코 틀린 버그 9 개월 전 수정되었습니다
키릴 Rakhman을

310

SQLite 문자열 연결을 사용하여 연결할 수 있습니다.

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

1
심지어 코 틀린 버그 일 : youtrack.jetbrains.com/issue/KT-17959
안드리 안토 노프

7
이 접근 방식은 실제로 질문이 요구 한 것입니다. 다른 답변도 꽤 좋습니다.
xarlymg89

나는 이해 '%'하지만 누군가가 무엇 '||'이며 왜 설명 할 수 있습니까?
Ali Kazi

15
||문자열 연결 연산자입니다. +Java String에서 와 같이 생각하십시오 .
Sanlok 리

훌륭한 대답입니다. 정말 감사합니다.
reza_khalafi

0

Room 은 메서드 매개 변수와 쿼리 바인딩 매개 변수 간의 혼동을 피하기 위해 명명 된 bind 매개 변수 : name 만 지원합니다 .

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.