web-dev-qa-db-ja.com

注釈引数はコンパイル時定数でなければなりません

this の質問を見ました。同様のエラーですが、私の場合は違います。

ルームiでの作業中にテーブルを作成していました。それはうまく機能していました。

@Daointerface 
UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(user: User)

@Delete
fun delete(user: User)}

しかし、その後、すべてのテーブル名は別のクラスに保存する必要があることがわかりました。テーブル名「ユーザー」のように->別のクラスに保存されます。

例えば。

class Table {
companion object {
    const val USER_TABLE = "user"
}}

しかし、以下のコードは機能していません。 Tableクラスからテーブル名を取得していません。コンパイル時エラーを与える 「アノテーション引数はコンパイル時定数でなければなりません」私を助けてください。

@Query("SELECT * FROM $Table.USER_TABLE")
fun getAll(): List<User>
7
Tarun

問題はエラーに記載されているもので、@Queryアノテーションの引数を動的に定義することはできません。テーブルの名前を別の場所で定義する場合は、文字列連結を使用します。次のようにできます:

@Query("SELECT * FROM " + Table.USER_TABLE)
fun getAll(): List<User>

これが、この google サンプルでの方法です。

4
Levi Moreira

Kotlinでドル記号付きの@Value注釈を使用する場合は、文字列の連結をエスケープする必要があります(\$を追加):

@Query("SELECT * FROM \$Table.USER_TABLE")
fun getAll(): List<User>
1
floatingmuseum

クエリで列を使用し、このメソッドでアクセスする場合は、データクラスとアクセスでも列名を定義する必要があります。

@Query("SELECT * FROM ${Table.USER_TABLE}")