Sala de Android: Cada variable de enlace en la consulta debe tener un método de coincidencia

Estoy utilizando la biblioteca de persistencia de Android con kotlin.

El Dao se ve así

@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 } 

Me parece bien, pero estoy recibiendo este error

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

Puedo ver que el parámetro se llama como countryId , así que ¿qué puede ser el problema?

FYI: Aquí está el código generado en 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(); } } 

En este método veo arg0 no se utiliza en ninguna parte del método.

Kotlin no está preservando los nombres de los argumentos correctamente – esto es https://youtrack.jetbrains.com/issue/KT-17959

Puede :arg0 esto utilizando :arg0 , :arg1 , etc, como nombres de parámetros en sus instrucciones @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 

Parece fijado en kotlin-gradle-plugin: 1.1.3

Este problema ahora se puede corregir usando 1.1.3-eap-85 y kotlin-kapt. Tweet oficial

Como Anton Kazakov dijo que este error se ha corregido en kotlin plugin 1.1.3-eap-85

Pero puesto que no es público todavía usted necesita descargarlo de su repositorio del privet, no de jcenter

Por lo que necesita agregar esta línea en su build.gradle

  maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } 

ejemplo

 buildscript { ext { kotlin_version = '1.1.3-eap-85' } repositories { google() jcenter() maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } } dependencies { classpath 'com.android.tools.build:gradle:3.0.0-alpha7' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() mavenCentral() maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } } } 
  • Android: Kotlin con Butterknife
  • ¿Cuál es la mejor manera de declarar en el componente de la interfaz de usuario en android con Kotlin?
  • Call class 'constructor por reflexión con Kotlin
  • Kotlin: Iterate a través de un JSONArray
  • Cómo usar kapt en el alcance de androidTest
  • Kotlin: ¿Qué significa "return @"?
  • StackOverflowError utilizando Singleton en Kotlin
  • Referencia no resuelta en el anonimo oyente de Kotlin
  • ¿Es Kotlin 100% compatible con ART en Android?
  • El constructor de vista personalizada en Android 4.4 se bloquea en Kotlin, ¿cómo arreglarlo?
  • "No se puede encontrar la clase referenciada" con Proguard y Kotlin
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.