Android 房间关系
Android room relations
我有两个看起来像这样的实体(为阅读目的而简化)。
@Entity
public class Machine {
@PrimaryKey
private long id
}
@Entity
public class MachineType {
@PrimaryKey
private long id
}
我想要的是具有机器类型的机器实体。
我尝试了外键,但我的问题是它根本不像包含外部实体的 Spring 引导等效持久性库(我不知道如何解释得足够好)。这是 spring 中 REST-api 的示例:
{
"id": 1,
"name": "foo",
"machineType": {
"id": 1,
"name": "bar"
}
}
而带外键的房间是这样的:
{
"id": 1,
"name": "foo",
"machineType_id": 1
}
当我将对象放回 API 时,这给我带来了各种麻烦。
所以我尝试使用 @Relation 注释,因为这听起来像我需要的,但这只会产生错误,因为相关对象的列包含在主要实体中,所以我得到两个 "id" 列。
error: Multiple fields have the same columnName: id. Field names: id, machineType > id.
请帮忙。我走错路了吗?我的问题有更好的解决方案吗?
Embedded Annotation 在这种情况下很有用。
Link for embedded
所以您需要做的是在机器 class 中有一个 MachineType 对象并用 @Embedded
注释它。另外为了避免有两个同名的变量,在本例中是 id
,你可以使用这个注解
@ColumnInfo(name = "some_column_name")
有一个不同于变量名的列名。
当您插入数据时,更改 table 列名,如下面的代码,您可以在房间数据库中提供列名。
@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 对相同 class 的响应时,服务器的唯一密钥当时使用此关键字在服务器密钥中指定特定字段,如下所示 ..
@SerializedName("name")
@ColumnInfo(name="sName")
private String name;
我有两个看起来像这样的实体(为阅读目的而简化)。
@Entity
public class Machine {
@PrimaryKey
private long id
}
@Entity
public class MachineType {
@PrimaryKey
private long id
}
我想要的是具有机器类型的机器实体。 我尝试了外键,但我的问题是它根本不像包含外部实体的 Spring 引导等效持久性库(我不知道如何解释得足够好)。这是 spring 中 REST-api 的示例:
{
"id": 1,
"name": "foo",
"machineType": {
"id": 1,
"name": "bar"
}
}
而带外键的房间是这样的:
{
"id": 1,
"name": "foo",
"machineType_id": 1
}
当我将对象放回 API 时,这给我带来了各种麻烦。 所以我尝试使用 @Relation 注释,因为这听起来像我需要的,但这只会产生错误,因为相关对象的列包含在主要实体中,所以我得到两个 "id" 列。
error: Multiple fields have the same columnName: id. Field names: id, machineType > id.
请帮忙。我走错路了吗?我的问题有更好的解决方案吗?
Embedded Annotation 在这种情况下很有用。 Link for embedded
所以您需要做的是在机器 class 中有一个 MachineType 对象并用 @Embedded
注释它。另外为了避免有两个同名的变量,在本例中是 id
,你可以使用这个注解
@ColumnInfo(name = "some_column_name")
有一个不同于变量名的列名。
当您插入数据时,更改 table 列名,如下面的代码,您可以在房间数据库中提供列名。
@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 对相同 class 的响应时,服务器的唯一密钥当时使用此关键字在服务器密钥中指定特定字段,如下所示 ..
@SerializedName("name")
@ColumnInfo(name="sName")
private String name;