Androidルーム-LIKEを使用したクエリの選択


104

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

@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

これを修正するには?

回答:


141

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

例えばこれを試してください:

@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
Kirill Rakhman '25

@KirillRakhmanですが、この方法は引き続き正常に機能します;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov

@AndriyAntonovコトリンのバグは9か月前に修正されました
Kirill Rakhman

306

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

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

1
コトリンのバグでも動作します:youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov

7
このアプローチは実際に質問が求めていたものです。他の答えもかなり良いですが。
xarlymg89 2018

私は理解して'%'いますが、誰かが'||'その理由を説明できますか?
Ali Kazi

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.