Phòng Android - Chọn truy vấn với LIKE


104

Tôi đang cố tạo truy vấn để tìm kiếm tất cả các đối tượng có tên chứa văn bản:

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

Tin nhắn:

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

Tôi cũng đang cố gắng:

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

Tin nhắn:

Error:Unused parameter: arg0

Làm thế nào để khắc phục điều này?

Câu trả lời:


141

Bạn nên bao gồm các %ký tự trong truy vấn đầu vào của mình - không phải trong chính truy vấn.

Ví dụ: hãy thử cái này:

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

Sau đó, String searchgiá trị của bạn sẽ giống như:

search = "%fido%";
loadHamsters(search);

Hơn nữa, tên tham số ràng buộc phải khớp với tên biến, vì vậy thay vì arg0nó phải giống như sau:

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

4
Lưu ý rằng hiện có một lỗi với tên thông số trong quá trình xử lý chú thích của Kotlin: youtrack.jetbrains.com/issue/KT-17959
Kirill Rakhman,

@KirillRakhman nhưng phương pháp này vẫn hoạt động tốt ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov

@AndriyAntonov lỗi Kotlin đã được cố định 9 months ago
Kirill Rakhman

306

Bạn chỉ có thể nối bằng cách sử dụng nối chuỗi SQLite.

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

1
hoạt động ngay cả với lỗi kotlin: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov

7
Cách tiếp cận này thực sự là những gì câu hỏi được yêu cầu. Mặc dù câu trả lời khác cũng khá tốt.
xarlymg89

Tôi hiểu '%'nhưng ai đó có thể giải thích là gì '||'và tại sao không?
Ali Kazi

15
||là toán tử nối chuỗi. Hãy nghĩ về nó như +trong Chuỗi Java.
Sanlok Lee

câu trả lời tuyệt vời. Cảm ơn bạn rất nhiều.
reza_khalafi

0

Room chỉ hỗ trợ tham số bind có tên : name để tránh bất kỳ sự nhầm lẫn nào giữa tham số phương thức và tham số ràng buộc truy vấn.

Room sẽ tự động liên kết các tham số của phương thức vào các đối số ràng buộc. Điều này được thực hiện bằng cách khớp tên của các tham số với tên của các đối số ràng buộc.

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.