名前にテキストが含まれるすべてのオブジェクトを検索するクエリを作成しようとしています:
@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
これを修正する方法は?
%
文字は、クエリ自体ではなく、入力クエリで囲む必要があります。
例えば。これを試して:
@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>>
SQLite文字列連結を使用して連結できます。
@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
ルームは、名前付きバインドパラメーター: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);