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>
問題はエラーに記載されているもので、@Query
アノテーションの引数を動的に定義することはできません。テーブルの名前を別の場所で定義する場合は、文字列連結を使用します。次のようにできます:
@Query("SELECT * FROM " + Table.USER_TABLE)
fun getAll(): List<User>
これが、この google サンプルでの方法です。
Kotlinでドル記号付きの@Value
注釈を使用する場合は、文字列の連結をエスケープする必要があります(\
に$
を追加):
@Query("SELECT * FROM \$Table.USER_TABLE")
fun getAll(): List<User>
クエリで列を使用し、このメソッドでアクセスする場合は、データクラスとアクセスでも列名を定義する必要があります。
@Query("SELECT * FROM ${Table.USER_TABLE}")