问题描述与处理策略
1、问题描述
java
@Entity(tableName = "Car",
indices = {
@Index(name = "idx_car_carId_unique", value = {"carId"}, unique = true),
@Index(name = "idx_car_carNum_unique", value = {"carNum"}, unique = true)
})
public class Car extends BaseEntity {
@ColumnInfo(name = "carId")
@NonNull
public Integer carId;
@ColumnInfo(name = "carName")
public String carName;
@ColumnInfo(name = "carNum")
@NonNull
public String carNum;
public Car() {
}
public Car(@NonNull Integer carId, String carName, @NonNull String carNum) {
this.carId = carId;
this.carName = carName;
this.carNum = carNum;
}
@Override
public String toString() {
return "Car{" +
"carId=" + carId +
", carName='" + carName + '\'' +
", carNum='" + carNum + '\'' +
'}';
}
}
-
在 Room 中,上述定义的实体类,在构建时报如下错误
There are multiple good constructors and Room will pick the no-arg constructor.
You can use the @Ignore annotation to eliminate unwanted constructors.
public class Car extends BaseEntity {
^翻译
有多个构造函数,Room 将选择无参数构造函数。
您可以使用 @Ignore 注释来消除不需要的构造函数。
2、问题原因
-
Room 要求实体类必须有一个明确的构造函数,Room 优先选择无参构造函数
-
如果类中有其他构造函数,Room 会报错,因为它无法确定应该使用哪个构造函数
-
在代码中,Car 有两个构造函数,分别为无参构造函数
public Car() {}
和带参构造函数public Car(@NonNull Integer carId, String carName, @NonNull String carNum)
,Room 无法确定应该使用哪个构造函数,因此报错
3、处理策略
-
使用
@Ignore
注解标记其他构造函数,例如,如果希望 Room 使用无参构造函数,可以使用@Ignore
注解标记带参构造函数,告诉 Room 忽略它 -
或者,删除其他构造函数,例如,如果希望 Room 使用无参构造函数,可以删除带参构造函数
- 这里选择使用
@Ignore
注解标记带参构造函数
java
@Ignore
public Car(@NonNull Integer carId, String carName, @NonNull String carNum) {
this.carId = carId;
this.carName = carName;
this.carNum = carNum;
}