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>
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.
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>
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}")