J'essaie de mettre à jour la table à l'aide de l'annotation @Query de la bibliothèque de la pièce. Voici mon code (interface Dao):
@Query("UPDATE table_name SET table_name.col1 = :val1 WHERE table_name.col2 = :val2")
void updateValue(long val1, long val2);
Terminez la chaîne d'erreur comme ci-dessous:
Error:(11, 10) error: no viable alternative at input 'UPDATE table_name SET table_name.'
Voici la classe d'entité:
@Entity(tableName = "table_name")
public class SampleTable {
@PrimaryKey
@ColumnInfo(name = "_id")
private Long Id;
@ColumnInfo(name = "col1")
private Long column1;
@ColumnInfo(name = "col2")
private Long column2;
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public Long getColumn1() {
return column1;
}
public void setColumn1(Long column1) {
this.column1 = column1;
}
public Long getColumn2() {
return column2;
}
public void setColumn2(Long column2) {
this.column2 = column2;
}
}
Qu'est ce qui ne va pas avec mon code ?
Essayez de changer votre déclaration en:
UPDATE table_name SET col1 = :val1 WHERE col2 = :val2.
Le message d'erreur donne l'impression que Room est déclenché par le préfixe.
Ceci est un bogue dans Room, au moins par le biais de 1.0.0-alpha8
. Suivre ce problème pour voir quand il sera corrigé.
Ce n'est en fait pas une syntaxe SQLite valide, comme il se trouve . Les préfixes de table vont sur les colonnes dans les instructions SELECT
, pas les instructions UPDATE
.
Cette erreur peut également se produire dans ce cas:
Si vous passez une liste, n'oubliez pas d'ajouter les parenthèses entourant votre variable de liste, sinon vous obtiendrez la même erreur:
@Query("select name from mytable where name in (:myList)")
LiveData<List<String>> findNames(List<String> myList);
Dans mon cas, un message était error: no viable alternative at input 'is'
(et un nom de requête a été mentionné). J'ai trouvé que la requête ne comportait pas d'espaces nécessaires entre des mots comme ici:
"from car" + // Add a space here.
"where brand_id is null" +