【问题标题】:Android Room and inheritance. error: Multiple fields have the same columnNameAndroid Room 和继承。错误:多个字段具有相同的columnName
【发布时间】:2020-05-12 08:02:10
【问题描述】:

我有一个继承关系,我正在尝试将其保留到 Room 数据库中。如果我删除继承关系,它会很好地工作,但是如果我不这样做,我会收到以下错误:

error: Multiple fields have the same columnName: uuid. Field names: uuid, uuid.

这是基类

@Parcelize
open class BaseContent(@PrimaryKey @ColumnInfo(name = "uuid") @Expose @SerializedName("uuid") open 
var uuid: String,
@ColumnInfo(name = "category") @Expose @SerializedName("category") 
open var category: String) : Parcelable {

}

这是一个子类

@Entity(tableName = "article")
@Parcelize
data class Article(override var uuid: String,
                    override var category: String,
                    @ColumnInfo(name = "message") @Expose @SerializedName("message") var message: 
String,
                    @ColumnInfo(name = "permanent") @Expose @SerializedName("permanent") var 
permanent: Boolean) : BaseContent(uuid, category) {

}

这是另一个子类

@Entity(tableName = "post")
@Parcelize
data class Post(override var uuid: String,
                     override var category: String,
                     @ColumnInfo(name = "timestamp") @Expose @SerializedName("timestamp") var 
timeStamp: String,
                     @ColumnInfo(name = "title") @Expose @SerializedName("title") var title: String,
                     @ColumnInfo(name = "description") @Expose @SerializedName("description") var 
description: String) : BaseContent(uuid, category) {

}

知道发生了什么吗?如果我在 Java 中执行它就可以了。

谢谢

【问题讨论】:

    标签: java android kotlin android-room


    【解决方案1】:

    您似乎遇到了 kapt Room 的错误(可能没有,但我没有找到合适的决定)

    您可以尝试选择一种不太优雅的替代方案:

    1. 使用接口代替父类。

    interface BaseContent { var uuid: String var category: String }

    1. 从您的子类中丢弃继承的字段(因为它们无论如何都会被继承)。

    你的基类:

    @Parcelize
    open class BaseContent(
        @PrimaryKey @ColumnInfo(name = "uuid") @Expose @SerializedName("uuid") open var uuid: String = "",
        @ColumnInfo(name = "category") @Expose @SerializedName("category") open var category: String = "") : Parcelable {
    }
    

    还有你的孩子:

    @Entity(tableName = "article")
    @Parcelize
    data class Article(
        @ColumnInfo(name = "message") @Expose @SerializedName("message") var message: String,
        @ColumnInfo(name = "permanent") @Expose @SerializedName("permanent") var permanent: Boolean) : BaseContent() {
    }
    
    1. 使用 Java 来声明您的实体(因为您说它可以正常工作)。

    【讨论】:

    • 谢谢,我最终使用了一个界面,但对我来说只是一个补丁。我仍然不明白为什么这不起作用
    • 如果是错误,那么由于设计师的错误,“那是行不通的” :-) 可能有更正确的方法,但我还没有找到
    【解决方案2】:

    我在 parcable 和继承方面遇到了类似的问题。我所做的是将基类及其变量更改为抽象,从而消除了错误并按预期工作。所以:

    abstract class BaseContent : Parcelable { abstract var baseVar: Int? }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      相关资源
      最近更新 更多