i have seen this question. Similar error.But in my case it is different.
While working with Room i was creating table. it was working fine.
@Daointerface
UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(user: User)
@Delete
fun delete(user: User)}
but then i found all table Names must be stored in a different class. like table name "user" - > Stored in different class.
Eg.
class Table {
companion object {
const val USER_TABLE = "user"
}}
But below code is not working . it is not picking up table name from Table class. Giving compile time error . "An Annotation argument must be a compile time constant" please help me out.What wrong in it
@Query("SELECT * FROM $Table.USER_TABLE")
fun getAll(): List<User>
You need to escape the String concatenation when using @Value
annotation with the dollar symbol in Kotlin (prepend \
to $
):
@Query("SELECT * FROM \$Table.USER_TABLE")
fun getAll(): List<User>
The problem is the one stated in the error, you can't have dynamically defined arguments for your @Query
annotation. If you want to define the name of the table somewhere else, use string concatenation. You can do it like this:
@Query("SELECT * FROM " + Table.USER_TABLE)
fun getAll(): List<User>
This is how they do it in this google sample.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With