La sala no puede elegir un constructor ya que varios constructores son un error adecuado

Intento implementar una biblioteca persistente en mi proyecto android kotlin, pero detecto este error en time de compilation:

error: la sala no puede elegir un constructor ya que varios constructores son adecuados. Intenta anotar constructores no deseados con @Ignore.

Código de error:

@Entity data class Site( var name: String = "", var url: String = "", @PrimaryKey(autoGenerate = true) var id: Long = 0) 

Tengo este error, porque kotlin aparentemente genera múltiples constructores de java para un único constructor de kotlin con valores de argumento pnetworkingeterminados. El código de trabajo se ve a continuación:

 @Entity data class Site( var name: String, var url: String, @PrimaryKey(autoGenerate = true) var id: Long) 

Esto funcionó para mí:

 @Entity data class Site( @PrimaryKey(autoGenerate = true) var id: Long = 0), var name: String = "", var url: String = "", @Ignore var ignonetworking: String? = null ) 

Ninguna de las soluciones anteriores es buena, ya que funcionan, pero pueden causar errores.

La class de datos de Kotlin genera varios methods utilizando el constructor pnetworkingeterminado. Eso significa que las funciones equals () , hashCode () , toString () , componentN () y copy () se generan utilizando los attributes que asigna a su constructor.

Usando las soluciones anteriores como

 @Entity data class Site(@PrimaryKey(autoGenerate = true) var id: Long) { @Ignore constructor() : this(0) var name: String = "" var url: String = "" } 

genera todos los methods enumerados anteriormente solo para id. Usar iguales conduce a una calidad no deseada, al igual que aString (). Para resolver esto, debe tener todos los attributes que desea procesar dentro del constructor y agregar un segundo constructor usando ignorar como

 @Entity data class Site( @NonNull @PrimaryKey(autoGenerate = true) var id: Long, var name: String = "", var url: String = "") { @Ignore constructor(id = 0, name = ", url = "") : this() } 

Deberías tener en count que normalmente usas classs de datos para tener methods como toString y copy. Solo esta solución funciona para evitar errores no deseados durante el time de ejecución.

Aquí cambia la version database de su aplicación y reinicia el progtwig, funcionará:

 @Database(entities = arrayOf(Site::class), version = 123) abstract class YourAppDatabase : RoomDatabase() { abstract fun yourDao(): YourDao } 

y también puedes probar esta data class :

  @Entity data class Site(@PrimaryKey(autoGenerate = true) var id: Long) { @Ignore constructor() : this(0) var name: String = "", var url: String = "", } 

y la última instrucción: su id key principal debe incrementarse manualmente .

Espero que eso te funcione. 🙂

Prueba para mostrar que las respuestas anteriores no son válidas.

 data class TestModel(var id: Int = 0) { constructor() : this(0) var name: String = "defaultname" var testData: String = "defaulttestData" } val testModel = TestModel(5) testModel.name = "test" val testModel2 = TestModel(5) testModel2.testData = "testdata" testModel2.name = "test" info { "Test with name set: $testModel" } info { "Testdata equals Testdata2 ${testModel.equals(testModel2)}" } 

devuelve Test con nombre establecido: TestModel (id = 5) y Testdata es igual a Testdata2 true

  • No se puede get respuesta de justo
  • FragmentTransaction hide / show no funciona a veces
  • ¿Cómo componer funciones con parmetros / types de resultados compatibles en Kotlin?
  • Delegado observable circunloquio
  • ¿Es una buena práctica usar la function de ejecución en lugar de devolver en Kotlin?
  • Kotlin: ¿Cómo verificar si enum contiene una cadena dada sin interferir con las excepciones?
  • Cómo recuperar datos de una tabla personalizada en Corda
  • Nombrar una condición if-value para usar en if block
  • eclipse organiza import no funciona con files kotlin
  • ¿Cómo crear proxy dynamic / transparente en Kotlin?
  • ¿Por qué este tipo necesita un lanzamiento explícito?