房间持久性:实体和 POJO 必须具有可用的构造函数

2022-09-03 06:58:38

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

以下是我对实体的代码:

@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;
    }
}

我得到的错误:

错误:(14, 8) 错误:实体和 Pojos 必须具有可用的公共构造函数。可以有一个空构造函数,也可以有一个参数与字段匹配的构造函数(按名称和类型)。尝试了以下构造函数,但它们无法匹配: User(java.lang.String,java.lang.String,java.lang.String,java.lang.String) : [id : null, username : null, email : null, password : null]

还有这个:

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


答案 1

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

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

来源:安卓开发者


答案 2

试试这个:-

@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;
}

推荐