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;
}
相关推荐
chian-ocean11 分钟前
进程的家园:探索 Linux 地址空间的奥秘
android·java·linux
c1assy32 分钟前
天机学堂3-ES+Caffeine
android·java·elasticsearch
专注VB编程开发20年1 小时前
c#有什么显示矢量图SVG的控件VB.NET-svg转透明PNG图像
开发语言·c#·.net·svg·矢量图
蹦蹦跳跳真可爱5891 小时前
Python----Python基础(字符串,列表,元组,字典,集合的总结)
开发语言·python
元_汐1 小时前
【Python通过UDP协议传输视频数据】(界面识别)
开发语言·网络·python·网络协议·tcp/ip·udp
多多*2 小时前
线程池相关 FutureTask介绍 处理阻塞 Future改进->CompletableFuture
java·开发语言·后端·python·spring
siy23332 小时前
[c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
c语言·开发语言·笔记·学习·算法
Quantum&Coder3 小时前
Swift语言的软件工程
开发语言·后端·golang
CyberScriptor4 小时前
CSS语言的语法糖
开发语言·后端·golang
夕阳_醉了7 小时前
如何在JS里进行深拷贝
开发语言·javascript·ecmascript