由于多个构造函数是合适的错误,因此无法选择构造函数

时间:2017-06-19 00:39:11

标签: android constructor kotlin android-room android-components

我尝试在我的android kotlin项目中实现持久库,但在编译时捕获此错误:

  

错误:由于有多个构造函数,因此无法选择构造函数   适当。尝试使用@Ignore注释不需要的构造函数。

错误代码:

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

9 个答案:

答案 0 :(得分:13)

我遇到了这个错误,因为Kotlin显然为一个具有默认参数值的Kotlin构造函数生成了多个Java构造函数。工作代码见下:

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

答案 1 :(得分:6)

上述解决方案均不好,因为它们有效,但可能会导致错误。

Kotlin的Data Class使用默认构造函数生成多个方法。这意味着equals()hashCode(), 使用您为构造函数指定的属性生成toString()componentN() functionscopy()

使用上述解决方案,如

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

仅为id生成以上列出的所有方法。使用equals会导致不必要的质量,与toString()相同。解决这个问题需要您拥有要在构造函数中处理的所有属性,并使用ignore添加第二个构造函数,如

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

你应该记住,你通常使用数据类来拥有像toString和copy这样的方法。只有这个解决方案才能在运行时避免不必要的错误。

答案 2 :(得分:2)

这对我有用:

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

答案 3 :(得分:1)

这对我有用

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

我使用@Ignore禁止ROOM警告

  

有多个好的构造函数,Room将选择no-arg构造函数。您可以使用@Ignore批注消除不必要的构造函数。

并为ROOM添加默认的构造函数。

答案 4 :(得分:1)

尝试将变量数据类型从val更改为var:

之前:

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

之后:

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

答案 5 :(得分:1)

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

站点的不变模型类。为了使用Room进行编译,我们可以使用@JvmOverloads处理多个构造函数。

答案 6 :(得分:0)

在这里,您可以更改应用程序数据库version并重新启动程序agian,它将起作用:

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

您也可以尝试data class

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

以及最后一条说明:您的主键id手动递增

希望对你有用。 :)

测试以显示上述答案无效。

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)}" }

返回名称设置为Test:TestModel(id = 5),Testdata等于Testdata2为真

答案 7 :(得分:0)

离开我的答案,以防有人帮助。我遇到了同样的问题,上面的答案都没有奏效。唯一有效的方法是从data class更改为class。我邀请任何人尝试相同的代码,并解释为什么它成功了:

<强>之前

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

<强>后

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

这真的很奇怪,但我怀疑这是Android Studio缓存问题,因为将其更改回data class会导致错误再次出现。似乎这是集合字段的某种问题。我检查了生成的类中的构造函数,它看起来很好,我不知道为什么构建失败,即使构造函数正确生成:

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();
}

如果有人可以找到解决方法而无法从data class更改为class,请随时在下方发表评论。

答案 8 :(得分:0)

错误是由最初在构造函数中设置的变量引起的。如果只有一个构造函数,则将代码更改为此。

description,

如果您还需要空的构造函数,那么您应该这样做

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