41 votes

Android Room : Chaque variable de liaison dans la requête doit avoir une méthode correspondante.

J'utilise la bibliothèque de persistance Android Room avec Kotlin.

Le site Dao ressemble à ceci

@Dao
interface CountryDao {
    @Query("SELECT * FROM countries")
    fun loadAllCountried() : LiveData<List<CountryEntity>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(products: List<CountryEntity>)

    @Query("SELECT * FROM countries WHERE id = :countryId")
    fun loadCountry(countryId: Int): LiveData<CountryEntity>

    @Query("SELECT * FROM countries WHERE id = :countryId")
    fun loadCountrySync(countryId: Int): CountryEntity

}

Cela me semble bon mais j'obtiens cette erreur

Error: Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :countryId.

Je peux voir que le paramètre est nommé comme countryId Alors, quel est le problème ?

FYI : Voici le code généré dans CountryDao_Impl.java

@Override
public CountryEntity loadCountrySync(int arg0) {
  final String _sql = "SELECT * FROM countries WHERE id = ?";
  final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1);
  int _argIndex = 1;
  final Cursor _cursor = __db.query(_statement);
  try {
    final int _cursorIndexOfId = _cursor.getColumnIndexOrThrow("id");
    final int _cursorIndexOfPopulation = _cursor.getColumnIndexOrThrow("population");
    final CountryEntity _result;
   if(_cursor.moveToFirst()) {
     _result = new CountryEntity();
      final int _tmpId;
      _tmpId = _cursor.getInt(_cursorIndexOfId);
      _result.setId(_tmpId);
      final long _tmpPopulation;
      _tmpPopulation = _cursor.getLong(_cursorIndexOfPopulation);
      _result.setPopulation(_tmpPopulation);
    } else {
      _result = null;
    }
    return _result;
  } finally {
    _cursor.close();
    _statement.release();
  }
}

Dans cette méthode, je vois arg0 n'est utilisé nulle part dans la méthode.

EDIT : Cela semble être corrigé dans les nouveaux plugins. Plusieurs des réponses ici sont correctes, mais je ne peux pas accepter toutes les réponses, Désolé.

0 votes

Comment avez-vous obtenu ce code généré ?

68voto

Tom Insam Points 646

Kotlin ne préserve pas correctement les noms des arguments - c'est https://youtrack.jetbrains.com/issue/KT-17959

Vous pouvez contourner ce problème en utilisant :arg0 , :arg1 etc., comme noms de paramètres dans vos instructions @Query :

@Query("SELECT * FROM countries WHERE id = :arg0")
fun loadCountry(countryId: Int): LiveData<CountryEntity>

@Query("SELECT * FROM countries WHERE id = :arg0")
fun loadCountrySync(countryId: Int): CountryEntity

0 votes

Je reçois : Chaque variable bind dans la requête doit avoir un paramètre de méthode correspondant. Impossible de trouver les paramètres de méthode pour :arg1, :arg0

1 votes

Notez qu'à partir d'avril 2019, ayant fait une mise à jour d'Android studio sur un ancien projet, chambre mise à jour à la v1.1.1, j'ai découvert que l'utilisation de arg0 était en fait le problème, et j'ai dû éditer mes fichiers DOA pour remplacer arg0 pour correspondre au nom du paramètre de la fonction. c'est-à-dire que arg0 est devenu countryId.

13voto

Clocker Points 190

Cette erreur se produit si vous n'avez pas apply plugin: 'kotlin-kapt' défini dans votre build.gradle fichier. Si vous activez le plugin kapt, le compilateur fera correspondre le paramètre de liaison avec les arguments de la méthode comme prévu.

8voto

Avec kotlin v.1.2.10 et plus dans le projet, cela ne fonctionne que de la manière suivante :

@Query("select * from user where pk = :userId")
fun findUserById(userId: Long): DBUser

noms " :userId "dans la requête et " userId " dans la méthode doivent être les mêmes.

1voto

Anton Kazakov Points 1981

Ce problème peut maintenant être corrigé en utilisant la version 1.1.3-eap-85 et kotlin-kapt. Tweet officiel

0 votes

Erreur:Impossible de trouver org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.3-eap-85.

0voto

Semble corrigé dans kotlin-gradle-plugin:1.1.3

4 votes

Pas réparé pour moi. Je dois utiliser var0

1 votes

J'utilise la version 1.1.61 du plugin kotlin grade et le problème persiste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X