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

Tai*_*yen 3 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
)
Run Code Online (Sandbox Code Playgroud)

这里有我的对象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
)
Run Code Online (Sandbox Code Playgroud)

在这里您可以找到我的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,

)
Run Code Online (Sandbox Code Playgroud)

这是我的错误:

error: Multiple fields have the same columnName: location_id. Field names: clientBean > locationBean > id, locationBean > id.
Run Code Online (Sandbox Code Playgroud)

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

谢谢您的帮助

Mur*_*ain 10

尝试使用带前缀的前缀,例如@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
)
Run Code Online (Sandbox Code Playgroud)

由于使用@Embedded时,Room将Embedded类的字段添加为同一表中的列。因此,当嵌入式类和所有者类之间可能存在字段名称重复的可能性时,请尝试使用前缀来避免重复。添加前缀后,Room将会执行的操作将在嵌入类的列名称之前添加前缀。请参阅文档以了解更多信息

  • 它创建 1 表并将所有者类和嵌入类的字段添加为同一表中的列。Embedded 可用于始终在另一个类中使用的情况,并且两者的字段都保存在同一个表中。如果您想创建不同的表,还有 @Relation 等。看看这个关于 Room 关系的简单介绍 https://medium.com/@magdamiu/android-room-persistence-library-relations-75bbe02e8522 (2认同)