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.