【问题标题】:Room Persistence: Entities and POJOs must have a usable constructorRoom Persistence:实体和 POJO 必须有一个可用的构造函数
【发布时间】:2018-06-24 11:18:58
【问题描述】:

我正在尝试通过 Room Persistence 库将数据库添加到我的 Android 应用程序。在编译时得到上述错误。此外,Room 找不到我的吸气剂,尽管我可以在我的代码中清楚地看到所有吸气剂。

这是我的实体代码:

@Entity(tableName = "users", indices = @Index(value = "username", unique = true))
public class User {

    @NonNull
    public String getuId() {
        return uId;
    }

    public void setuId(@NonNull String uId) {
        this.uId = uId;
    }

    public String getuUsername() {
        return uUsername;
    }

    public void setuUsername(String uUsername) {
        this.uUsername = uUsername;
    }

    @NonNull
    public String getuPassword() {
        return uPassword;
    }

    public void setuPassword(@NonNull String uPassword) {
        this.uPassword = uPassword;
    }

    public String getuEmail() {
        return uEmail;
    }

    public void setuEmail(String uEmail) {
        this.uEmail = uEmail;
    }

    @NonNull
    @PrimaryKey
    @ColumnInfo(name = "user_id")
    private String uId;

    @ColumnInfo(name = "username")
    private String uUsername;

    @NonNull
    @ColumnInfo(name = "password")
    private String uPassword;

    @ColumnInfo(name = "email")
    private String uEmail;


    @Ignore
    public User(String userName, String email, String password){
        uId = UUID.randomUUID().toString();
        uUsername = userName;
        uEmail = email;
        uPassword = password;
    }

    public User(@NonNull String id, String username, String email,@NonNull String password){
        this.uId = id;
        this.uUsername = username;
        this.uPassword = password;
        this.uEmail = email;
    }
}

我得到的错误是:

Error:(14, 8) 错误:实体和 Pojos 必须有一个可用的公共构造函数。您可以有一个空的构造函数或参数与字段匹配的构造函数(按名称和类型)。 尝试了以下构造函数,但它们未能匹配: 用户(java.lang.String,java.lang.String,java.lang.String,java.lang.String):[id:null,用户名:null,电子邮件:null,密码:null]

还有这个:

错误:(53, 20) 错误:找不到字段的 getter。 错误:(56, 20) 错误:找不到字段的 getter。 错误:(60, 20) 错误:找不到字段的 getter。 错误:(63, 20) 错误:找不到字段的 getter。

【问题讨论】:

  • 将参数名称更改为您的四参数构造函数以匹配字段名称。
  • 是的。我认为这里的错误信息很清楚。 uUsername != username
  • 如果这是我必须做的,我会跳下悬崖。立即测试!
  • 好吧,我现在觉得自己很愚蠢。谢谢,这解决了我的第一个问题。房间仍然无法找到我所有的吸气剂。有什么想法吗?

标签: java android android-room


【解决方案1】:

另见Room Persistence: Error:Entities and Pojos must have a usable public constructor。

在我的情况下,我不得不改变类:

@Entity(tableName = "country")
data class CountryEntity(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    var id: Int = 0,
    @ColumnInfo(name = "country_id")
    var countryId: Int? = null,
    @ColumnInfo(name = "language")
    var language: String? = null,
    @ColumnInfo(name = "country_name")
    var countryName: String? = null,
)

请注意,我使用var、@PrimaryKey 并使用值初始化所有字段。您可以改用constructor() : this(0, null, null, null)。

【讨论】:

    【解决方案2】:

    根据 CommonsWare 和 rmlan 的建议,我的第一个问题是更改构造函数中的参数名称以匹配变量名称。

    getter 的问题是 Room 使用 JavaBeans Conventions 作为他们的名字,所以例如我的 getuUsername() 应该是 getUUsername()。在我更改了所有 getter 以匹配构建成功之后。

    来源:Android Developers

    【讨论】:

      【解决方案3】:

      这只是意味着你必须像这样没有注释的无参数构造函数

       @Ignore
      public User(int uId, String uUsername, String uEmail, String 
       uPassword){
         this.uId = uId;
         this.uUsername = uUsername;
         this.uEmail = uEmail;
         this.uPassword = uPassword;
      }
      //parameterless constructor 
      //un annotated 
      public User(){
      
      }
      

      【讨论】:

      • 添加空的公共构造函数后仍然无法正常工作
      • @VivekPratapSingh 构建项目后,点击你的表类的空构造函数,它会打开你的Dao impl类,打开它。通常它会指出错误,这将是您问题的根本原因。
      【解决方案4】:

      试试这个:-

      @Ignore
      public User(int uId, String uUsername, String uEmail, String 
       uPassword){
         this.uId = uId;
         this.uUsername = uUsername;
         this.uEmail = uEmail;
         this.uPassword = uPassword;
      }
      
      public User(String uUsername, String uEmail, String 
       uPassword){
         this.uUsername = uUsername;
         this.uEmail = uEmail;
         this.uPassword = uPassword;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-05-21
        • 2020-09-03
        • 1970-01-01
        • 2017-11-20
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 2021-05-01
        • 2020-08-12
        相关资源
        最近更新 更多