【问题标题】:Android Room Multiple fields have the same columnNameAndroid Room 多个字段具有相同的 columnName
【发布时间】:2019-06-13 13:25:33
【问题描述】:

我遇到了 Room 的特定问题。我有一个对象

@Entity(tableName = "classifieds")
data class ClassifiedBean(
    @PrimaryKey
    @ColumnInfo(name = "id")
    @SerializedName("id")
    var id: String,

    @Embedded
    @SerializedName("client")
    var clientBean: ClientBean,

    @Embedded
    @SerializedName("location")
    var locationBean: LocationBean
)

这里有我的对象 LocationBean 和 ClientBean。

问题出在我的 ClientBean 内部,我还有一个具有相同属性(地址、邮政编码、城市、国家/地区...)的 LocationBean。

data class ClientBean(
    @ColumnInfo(name = "client_id")
    @SerializedName("id")
    var id: Int,

    @ColumnInfo(name = "name")
    @SerializedName("name")
    var name: String,

    @Embedded
    @SerializedName("location")
    var locationBean: LocationBean
)

在这里你可以找到我的 LocationBean

data class LocationBean (
    @ColumnInfo(name = "location_id")
    @SerializedName("locationId")
    var id: Int,

    @ColumnInfo(name = "country")
    @SerializedName("country")
    var country: String,

    @ColumnInfo(name = "city")
    @SerializedName("city")
    var city: String,

    @ColumnInfo(name = "address")
    @SerializedName("address")
    var address: String,

    @ColumnInfo(name = "postal_code")
    @SerializedName("postalCode")
    var postalCode: String,

)

这是我的错误:

error: Multiple fields have the same columnName: location_id. Field names: clientBean > locationBean > id, locationBean > id.

其中一个解决方案是创建 2 个具有相同属性的不同对象,但我想知道他们是否有其他解决方案?

感谢您的帮助

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    尝试使用带有嵌入的前缀,例如 @Embedded(prefix = "prefix_")。 希望将您的 ClientBean 类更改为以下代码可以正常工作

    data class ClientBean(
            @ColumnInfo(name = "client_id")
            @SerializedName("id")
            var id: Int,
    
            @ColumnInfo(name = "name")
            @SerializedName("name")
            var name: String,
    
            @Embedded(prefix = "client_bean_")
            @SerializedName("location")
            var locationBean: LocationBean
    )
    

    自从使用@Embedded 后,Room 将 Embedded 类的字段添加为同一张表中的列。因此,当嵌入式类和所有者类之间存在字段名称重复的可能性时,请尝试使用前缀以避免重复。 添加前缀后 Room 会做什么,它将在嵌入类的列名之前添加前缀。参考documentation to read more

    【讨论】:

    • 感谢您的解释。如果可能的话,我还有一个问题。当我们使用@Embedded 时,我想知道它是否会创建一个新表并自己做一些关系?或者它会将所有属性放在父对象中?
    • 它创建 1 个表并将所有者类和嵌入类的字段作为列添加到同一个表中。嵌入式可用于始终在另一个类中使用的地方,并且两者的字段都保存在同一个表中。如果您想创建不同的表,还有 @Relation 等。在Roommedium.com/@magdamiu/…看这个简单的关系介绍
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2022-09-30
    相关资源
    最近更新 更多