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

如何解决这个问题?

Answers:


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
Andriy Antonov

@AndriyAntonov的Kotlin错误已在9个月前修复
Kirill Rakhman

310

您可以使用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

我了解,'%'但是有人可以解释是什么'||',为什么?
阿里·卡兹

15
||是字符串连接运算符。可以将其视为+Java String中的。
Sanlok Lee,

很棒的答案。非常感谢
reza_khalafi

0

Room仅支持命名绑定参数: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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.