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

  • Kotlin y ejemplificación de matriz detallada
  • Propiedad de extensión en línea Kotlin
  • Dagger 2 en Kotlin reference no resuelta DaggerXXXSub
  • ¿Cómo debo probar las funciones de extensión de Kotlin?
  • Las @annotations de Kotlin repetibles no funcionan en jdk-8
  • Prolongación de efectivo.Estado en CORDA
  • java.lang.IllegalStateException: TextView no debe ser nulo (Android / Kotlin)
  • Kotlin sorting array de una class basada en una var dentro de la class
  • Restablecimiento de valores y properties diferidas de Kotlin: un delegado perezoso reiniciable
  • Cómo convertir Any to Int en Kotlin
  • package Kotlin .kt class en un JAR