web-dev-qa-db-ja.com

Android Room-LIKEを使用したクエリの選択

名前にテキストが含まれるすべてのオブジェクトを検索するクエリを作成しようとしています:

@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

これを修正する方法は?

64
Denis Buzmakov

%文字は、クエリ自体ではなく、入力クエリで囲む必要があります。

例えば。これを試して:

@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>>
99
Cody Caughlan

SQLite文字列連結を使用して連結できます。

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

ルームは、名前付きバインドパラメーター: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);
0
Swapnil