web-dev-qa-db-fra.com

Un argument d'annotation doit être une constante de temps de compilation

j'ai vu cette question. Erreur similaire, mais dans mon cas, c'est différent.

Pendant que je travaillais avec Room, je créais une table. cela fonctionnait bien.

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

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

@Delete
fun delete(user: User)}

mais alors j'ai trouvé que tous les noms de table doivent être stockés dans une classe différente. comme le nom de la table "utilisateur" -> Stocké dans une classe différente.

Par exemple.

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

Mais le code ci-dessous ne fonctionne pas. il ne récupère pas le nom de la table dans la classe Table. Donner une erreur de temps de compilation . "Un argument d'annotation doit être une constante de temps de compilation" s'il vous plaît, aidez-moi.

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

Le problème est celui indiqué dans l'erreur, vous ne pouvez pas avoir d'arguments définis dynamiquement pour votre @Query annotation. Si vous souhaitez définir le nom de la table ailleurs, utilisez la concaténation de chaînes. Vous pouvez le faire comme ceci:

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

Voici comment ils le font dans cet google échantillon.

4
Levi Moreira

Vous devez échapper à la concaténation de chaînes lorsque vous utilisez @Value annotation avec le symbole du dollar dans Kotlin (préfixe \ à $):

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

Vous devez également définir le nom de la colonne dans la classe de données et accéder si vous souhaitez utiliser des colonnes dans les requêtes et y accéder via cette méthode:

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