【问题标题】:Android Room - Select query with LIKEAndroid Room - 使用 LIKE 选择查询
【发布时间】:2017-10-26 08:32:10
【问题描述】:

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

@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

如何解决这个问题?

【问题讨论】:

    标签: android kotlin android-room


    【解决方案1】:

    您可以使用 SQLite 字符串连接来连接。

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

    【讨论】:

    • 即使遇到 kotlin 错误也能工作:youtrack.jetbrains.com/issue/KT-17959
    • 这种方法实际上是问题所要求的。虽然另一个答案也很好。
    • 我了解'%',但谁能解释一下'||' 是什么以及为什么?
    • || 是字符串连接运算符。将其视为 Java 字符串中的 +
    • 很好的答案。非常感谢。
    【解决方案2】:

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

    例如试试这个:

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

    【讨论】:

    【解决方案3】:

    LIKE 关键字在房间数据库中使用的一些示例。

    1. Search_Query

      开始
      @Query("SELECT * FROM hamster WHERE name LIKE :search_query || '%'")
       fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
      
    2. Search_Query

      结尾
      @Query("SELECT * FROM hamster WHERE name LIKE '%' || :search_query ")
      fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
      
    3. 获取所有具有Search_Query

      @Query("SELECT * FROM hamster WHERE name LIKE '%' || :search_query || '%'")
      fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
      
    4. 使用 NOT LIKE 用于具有 Search_Query

      的数据除外
      @Query("SELECT * FROM hamster WHERE name NOT LIKE '%' || :search_query || '%'")
      fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
      

    【讨论】:

      【解决方案4】:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        相关资源
        最近更新 更多