ห้อง Android - เลือกข้อความค้นหาด้วย LIKE


108

ฉันกำลังพยายามสร้างคำค้นหาเพื่อค้นหาวัตถุทั้งหมดที่มีชื่อประกอบด้วยข้อความ:

@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

จะแก้ไขได้อย่างไร?

คำตอบ:


150

คุณควรใส่%อักขระในแบบสอบถามป้อนข้อมูลของคุณไม่ใช่ในแบบสอบถามเอง

เช่นลองสิ่งนี้:

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

5
โปรดทราบว่าขณะนี้มีข้อบกพร่องเกี่ยวกับชื่อพารามิเตอร์ในการประมวลผลคำอธิบายประกอบของ Kotlin: youtrack.jetbrains.com/issue/KT-17959
Kirill Rakhman

@KirillRakhman แต่วิธีนี้ยังใช้ได้ดี ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov

@AndriyAntonov ข้อผิดพลาด Kotlin ได้รับการแก้ไขเมื่อ 9 เดือนที่แล้ว
Kirill Rakhman

329

คุณสามารถเชื่อมต่อโดยใช้การต่อสตริง SQLite

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

1
ทำงานได้แม้กับบั๊ก kotlin: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov

7
แนวทางนี้เป็นสิ่งที่ถามหา แม้ว่าคำตอบอื่น ๆ ก็ค่อนข้างดีเช่นกัน
xarlymg89

ฉันเข้าใจ'%'แต่ใครสามารถอธิบายได้ว่าอะไรคืออะไร'||'และทำไม
Ali Kazi

17
||เป็นตัวดำเนินการเชื่อมต่อสตริง คิดว่าเป็น+ใน 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.