Android Room 构建问题:There are multiple good constructors

问题描述与处理策略

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、问题原因
  1. Room 要求实体类必须有一个明确的构造函数,Room 优先选择无参构造函数

  2. 如果类中有其他构造函数,Room 会报错,因为它无法确定应该使用哪个构造函数

  3. 在代码中,Car 有两个构造函数,分别为无参构造函数 public Car() {} 和带参构造函数 public Car(@NonNull Integer carId, String carName, @NonNull String carNum),Room 无法确定应该使用哪个构造函数,因此报错

3、处理策略
  1. 使用 @Ignore 注解标记其他构造函数,例如,如果希望 Room 使用无参构造函数,可以使用 @Ignore 注解标记带参构造函数,告诉 Room 忽略它

  2. 或者,删除其他构造函数,例如,如果希望 Room 使用无参构造函数,可以删除带参构造函数

  • 这里选择使用 @Ignore 注解标记带参构造函数
java 复制代码
@Ignore
public Car(@NonNull Integer carId, String carName, @NonNull String carNum) {
    this.carId = carId;
    this.carName = carName;
    this.carNum = carNum;
}
相关推荐
软件开发技术局30 分钟前
撕碎QT面具(8):对控件采用自动增加函数(转到槽)的方式,发现函数不能被调用的解决方案
开发语言·qt
周杰伦fans2 小时前
C#中修饰符
开发语言·c#
yngsqq2 小时前
c# —— StringBuilder 类
java·开发语言
赔罪2 小时前
Python 高级特性-切片
开发语言·python
子豪-中国机器人3 小时前
2月17日c语言框架
c语言·开发语言
夏天的阳光吖3 小时前
C++蓝桥杯基础篇(四)
开发语言·c++·蓝桥杯
oioihoii4 小时前
C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串转换工具
开发语言·c++
秋窗74 小时前
Mac下Python版本管理,适用于pyenv不起作用的情况
开发语言·python·macos
柯腾啊5 小时前
VSCode 中使用 Snippets 设置常用代码块
开发语言·前端·javascript·ide·vscode·编辑器·代码片段
CoderIsArt5 小时前
openGL和C#下使用openGL
开发语言·c#