Android Room多个字段具有相同的columnName

时间:2019-06-13 13:25:33

标签: android android-room

我正面临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内部,我还有一个具有相同属性(地址,postalCode,城市,国家/地区...)的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个具有相同属性的不同对象,但我想知道它们是否还有其他解决方案?

谢谢您的帮助

1 个答案:

答案 0 :(得分:4)

尝试使用嵌入的前缀,例如@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