Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android房间和继承。错误:多个字段具有相同的列名称_Java_Android_Kotlin_Android Room - Fatal编程技术网

Java Android房间和继承。错误:多个字段具有相同的列名称

Java Android房间和继承。错误:多个字段具有相同的列名称,java,android,kotlin,android-room,Java,Android,Kotlin,Android Room,我有一个继承关系,我正试图将其保存到房间数据库中。如果我删除继承关系,它会很好地工作,但是如果我不删除,则会出现以下错误: error: Multiple fields have the same columnName: uuid. Field names: uuid, uuid. 这是基类 @Parcelize open class BaseContent(@PrimaryKey @ColumnInfo(name = "uuid") @Expose @SerializedName("uuid

我有一个继承关系,我正试图将其保存到房间数据库中。如果我删除继承关系,它会很好地工作,但是如果我不删除,则会出现以下错误:

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

}
这是另一个儿童班

@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做的话,效果就很好了


谢谢

您似乎遇到了kapt Room的bug(可能不是,但我还没有找到合适的决定)

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

  • 使用接口代替父类
  • 接口基本内容{
    变量uuid:String
    变量类别:字符串
    }

  • 从子类中抛出继承的字段(因为它们无论如何都会被继承)
  • 您的基类:

    @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() {
    }
    
  • 使用Java来声明您的实体(因为您说过它工作得很好)
    我在可分配和继承方面也有类似的问题。我所做的是将基类及其变量更改为抽象类,从而消除了错误并按预期工作。因此:

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

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