【问题标题】:Android room relationsAndroid房间关系
【发布时间】:2018-04-11 08:20:51
【问题描述】:

我有两个看起来像这样的实体(为阅读目的而简化)。

@Entity
public class Machine {
    @PrimaryKey
    private long id
}

@Entity
public class MachineType {
    @PrimaryKey
    private long id
}

我想要的是拥有机器类型的机器实体。 我尝试了外键,但我的问题是它根本不像包含外部实体的 Spring Boot 等效 Persistence 库(我不知道如何解释得足够好)。下面是春季 REST-api 的一个示例:

{
    "id": 1,
    "name": "foo",
    "machineType": {
        "id": 1,
        "name": "bar"
    }
}

虽然有外键的房间是这样的:

{
    "id": 1,
    "name": "foo",
    "machineType_id": 1
}

在将对象放回 API 时,这给我带来了各种麻烦。 所以我尝试使用@Relation 注释,因为这听起来像我需要的,但这只会产生错误,因为来自相关对象的列包含在主实体中,所以我得到两个“id”列。

错误:多个字段具有相同的 columnName:id。字段名称:id, machineType > id.

请帮忙。我在错误的轨道上吗?我的问题有更好的解决方案吗?

【问题讨论】:

  • 所有完整的Entity类代码,未简化
  • 你用过@Relation 吗?

标签: android spring-data-jpa android-room


【解决方案1】:

当您像下面的代码插入数据更改表列名时,您可以在房间数据库中给出列名。

@Entity
public class Machine {
    @PrimaryKey
    @ColumnInfo(name = "nId")
    private long id;
    @ColumnInfo(name = "machineType_id")
    private long mId;

}

@Entity
public class MachineType {
    @PrimaryKey
    @ColumnInfo(name = "machineType_id")
    private long id;
}

当您获得同一类的 api 响应时,服务器的唯一键时间在服务器键中使用此关键字给出特定字段,如下所示..

@SerializedName("name")
@ColumnInfo(name="sName")
private String name;

【讨论】:

    【解决方案2】:

    在这种情况下,嵌入式注释可能很有用。 Link for embedded

    所以你需要做的是在 Machine 类中有一个 MachineType 对象,并用@Embedded 注释它。另外为了避免两个变量同名,在这种情况下是id,你可以使用这个注解 @ColumnInfo(name = "some_column_name") 具有与变量名不同的列名。

    Link for Column Info

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2018-08-06
      • 2020-07-16
      相关资源
      最近更新 更多