Android Room - 使用LIKE选择查询

Den*_*kov 73 android kotlin android-room

我正在尝试进行查询以搜索名称中包含文本的所有对象:

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

消息:

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
Run Code Online (Sandbox Code Playgroud)

我也在尝试:

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

消息:

Error:Unused parameter: arg0
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

yig*_*git 224

您可以使用SQLite字符串连接进行连接.

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

  • `||`是字符串连接运算符。在Java字符串中将其视为“ +”。 (8认同)
  • 这种方法实际上是问题所要求的.虽然另一个答案也很好. (6认同)
  • 我理解“%”,但有人可以解释什么是“||”以及为什么吗? (4认同)

Cod*_*lan 111

您应该%在输入查询中包含字符 - 而不是在查询本身中.

试试这个:

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

那你的String search价值应该是这样的:

search = "%fido%";
loadHamsters(search);
Run Code Online (Sandbox Code Playgroud)

此外,绑定参数名称应该与变量名称匹配,因此arg0它应该看起来像:

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

  • 请注意,Kotlin的注释处理中目前存在参数名称的错误:https://youtrack.jetbrains.com/issue/KT-17959 (4认同)

小智 54

dao 与 Room 数据库中使用的LIKE关键字的一些示例。

  1. 从Search_Query开始
@Query("SELECT * FROM hamster WHERE name LIKE :search_query || '%'")
    fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
Run Code Online (Sandbox Code Playgroud)
  1. 以Search_Query结尾
@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search_query ")
   fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
Run Code Online (Sandbox Code Playgroud)
  1. 获取所有具有Search_Query 的内容
@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search_query || '%'")
   fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
Run Code Online (Sandbox Code Playgroud)
  1. 使用 NOT LIKE 对于具有Search_Query 的数据除外
@Query("SELECT * FROM hamster WHERE name NOT LIKE '%' || :search_query || '%'")
   fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
Run Code Online (Sandbox Code Playgroud)