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;
}
相关推荐
封奚泽优5 分钟前
使用Python实现单词记忆软件
开发语言·python·random·qpushbutton·qtwidgets·qtcore·qtgui
kerli1 小时前
Android 嵌套滑动设计思想
android·客户端
liulilittle1 小时前
C++/CLI与标准C++的语法差异(一)
开发语言·c++·.net·cli·clr·托管·原生
daixin88481 小时前
什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?
java·开发语言·redis·缓存
你我约定有三1 小时前
RabbitMQ--消息丢失问题及解决
java·开发语言·分布式·后端·rabbitmq·ruby
张北北.2 小时前
【深入底层】C++开发简历4+4技能描述6
java·开发语言·c++
恣艺2 小时前
LeetCode 854:相似度为 K 的字符串
android·算法·leetcode
李永奉2 小时前
STM32-定时器的基本定时/计数功能实现配置教程(寄存器版)
c语言·开发语言·stm32·单片机·嵌入式硬件
go54631584652 小时前
中文语音识别与偏误检测系统开发
开发语言·人工智能·学习·生成对抗网络·数学建模·语音识别
NUC_Dodamce2 小时前
Cocos3x 解决同时勾选 适配屏幕宽度和 适配屏幕高度导致Widget组件失效的问题
开发语言·javascript·ecmascript