usar sobrecarga sirve que puede polimorfismo para metodos herencia ejercicios cuando constructores comando android constructor kotlin android-room android-components

android - sobrecarga - La sala no puede elegir un constructor ya que varios constructores son errores adecuados



super java herencia (8)

Aquí cambia la version base de datos de su aplicación y reinicia el programa nuevamente, 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 clave primaria debe incrementarse manualmente .

Espero que eso te funcione. :)

Prueba para demostrar 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 el conjunto de nombres: TestModel (id = 5) y Testdata es igual a Testdata2 true

Intento implementar una biblioteca persistente en mi proyecto de Android Kotlin, pero detecto este error en tiempo de compilación:

error: la habitación no puede elegir un constructor, ya que varios constructores son adecuados. Trate de 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)


El error es causado por las variables establecidas inicialmente en el constructor. Si solo tienes un constructor, cambia tu código a este.

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

Si también necesitas un constructor vacío, entonces debes hacer esto

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


Esto funcionó para mí:

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


Intente cambiar el tipo de datos variable de val a var:

ANTES DE :

@Entity data class Product( @PrimaryKey val id: String = "", val name: String = "" )

DESPUÉS :

@Entity data class Product( @PrimaryKey var id: String = "", var name: String = "" )


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

La clase de datos de Kotlin genera varios métodos utilizando el constructor predeterminado. Eso significa que las hashCode() equals() , hashCode() , toString() , componentN () y copy() se generan utilizando los atributos 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 métodos mencionados anteriormente solo para id. El uso de iguales conduce a una calidad no deseada, igual que toString (). Resolver esto requiere que tengas todos los atributos que quieras procesar dentro del constructor y agregues 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() }

Debe tener en cuenta que normalmente utiliza clases de datos para tener métodos como toString y copia. Solo esta solución funciona para evitar errores no deseados durante el tiempo de ejecución.


Solo dejando mi respuesta en caso de que ayude a alguien. Me encontré con el mismo problema, ninguna de las respuestas anteriores funcionó. Lo único que funcionó fue cambiar de una data class a una class . Invito a todos a probar el mismo código y explicar por qué hizo el truco:

antes de

@Entity data class ImgurGalleryPost ( @NotNull @PrimaryKey var id: String, var title: String?, var description: String?, var datetime: Int?, var cover: String?, var coverWidth: Int?, var coverHeight: Int?, var accountUrl: String?, var accountId: Int?, var privacy: String?, var layout: String?, var views: Int?, var link: String?, var ups: Int?, var downs: Int?, var points: Int?, var score: Int?, var isAlbum: Boolean?, var vote: Boolean?, var favorite: Boolean?, var nsfw: Boolean?, var section: String?, var commentCount: Int?, var favoriteCount: Int?, var topic: String?, var topicId: Int?, var imagesCount: Int?, var inGallery: Boolean?, var isAd: Boolean?, @NotNull @Ignore var tags: List<ImgurGalleryTag>, var inMostViral: Boolean?, @NotNull @Ignore var images: List<ImgurGalleryImage> )

Después

@Entity class ImgurGalleryPost ( @NotNull @PrimaryKey var id: String, var title: String?, var description: String?, var datetime: Int?, var cover: String?, var coverWidth: Int?, var coverHeight: Int?, var accountUrl: String?, var accountId: Int?, var privacy: String?, var layout: String?, var views: Int?, var link: String?, var ups: Int?, var downs: Int?, var points: Int?, var score: Int?, var isAlbum: Boolean?, var vote: Boolean?, var favorite: Boolean?, var nsfw: Boolean?, var section: String?, var commentCount: Int?, var favoriteCount: Int?, var topic: String?, var topicId: Int?, var imagesCount: Int?, var inGallery: Boolean?, var isAd: Boolean?, @NotNull @Ignore var tags: List<ImgurGalleryTag>, var inMostViral: Boolean?, @NotNull @Ignore var images: List<ImgurGalleryImage> )

Es realmente extraño, pero dudo que se trate de un problema de caché de Android Studio porque cambiarlo de nuevo a la data class hace que el error vuelva a aparecer. Parece que es un tipo de problema con los campos de colección. Revisé el constructor en la clase generada y se veía bien, no sé por qué la compilación fallaba incluso cuando el constructor se estaba generando correctamente:

public ImgurGalleryPost(@org.jetbrains.annotations.NotNull() java.lang.String id, @org.jetbrains.annotations.Nullable() java.lang.String title, @org.jetbrains.annotations.Nullable() java.lang.String description, @org.jetbrains.annotations.Nullable() java.lang.Integer datetime, @org.jetbrains.annotations.Nullable() java.lang.String cover, @org.jetbrains.annotations.Nullable() java.lang.Integer coverWidth, @org.jetbrains.annotations.Nullable() java.lang.Integer coverHeight, @org.jetbrains.annotations.Nullable() java.lang.String accountUrl, @org.jetbrains.annotations.Nullable() java.lang.Integer accountId, @org.jetbrains.annotations.Nullable() java.lang.String privacy, @org.jetbrains.annotations.Nullable() java.lang.String layout, @org.jetbrains.annotations.Nullable() java.lang.Integer views, @org.jetbrains.annotations.Nullable() java.lang.String link, @org.jetbrains.annotations.Nullable() java.lang.Integer ups, @org.jetbrains.annotations.Nullable() java.lang.Integer downs, @org.jetbrains.annotations.Nullable() java.lang.Integer points, @org.jetbrains.annotations.Nullable() java.lang.Integer score, @org.jetbrains.annotations.Nullable() java.lang.Boolean isAlbum, @org.jetbrains.annotations.Nullable() java.lang.Boolean vote, @org.jetbrains.annotations.Nullable() java.lang.Boolean favorite, @org.jetbrains.annotations.Nullable() java.lang.Boolean nsfw, @org.jetbrains.annotations.Nullable() java.lang.String section, @org.jetbrains.annotations.Nullable() java.lang.Integer commentCount, @org.jetbrains.annotations.Nullable() java.lang.Integer favoriteCount, @org.jetbrains.annotations.Nullable() java.lang.String topic, @org.jetbrains.annotations.Nullable() java.lang.Integer topicId, @org.jetbrains.annotations.Nullable() java.lang.Integer imagesCount, @org.jetbrains.annotations.Nullable() java.lang.Boolean inGallery, @org.jetbrains.annotations.Nullable() java.lang.Boolean isAd, @org.jetbrains.annotations.NotNull() java.util.List<com.kimboo.core.model.ImgurGalleryTag> tags, @org.jetbrains.annotations.Nullable() java.lang.Boolean inMostViral, @org.jetbrains.annotations.NotNull() java.util.List<com.kimboo.core.model.ImgurGalleryImage> images) { super(); }

Si alguien puede encontrar una manera de solucionar este problema sin cambiar de data class a class , no dude en comentar a continuación.


Tuve este error porque Kotlin aparentemente genera múltiples constructores de Java para un solo constructor de Kotlin con valores de argumento predeterminados. Código de trabajo ver a continuación:

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


esto funciona para mi

@Entity data class TaskDetail @Ignore constructor( @PrimaryKey(autoGenerate = true) var id:Long = 0, var taskId:Long = 0, var content:String = "") { constructor():this(id = 0) }

Utilizo @Ignore para prohibir la advertencia de SALA

Hay varios buenos constructores y Room seleccionará el constructor sin argumentos. Puede utilizar la anotación @Ignore para eliminar constructores no deseados.

Y añada un constructor por defecto para ROOM.