Room Persistence:实体和 POJO 必须有可用的构造函数

Room Persistence: Entities and POJOs must have a usable constructor

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

这是我的实体代码:

@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) error: Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). Tried the following constructors but they failed to match: User(java.lang.String,java.lang.String,java.lang.String,java.lang.String) : [id : null, username : null, email : null, password : null]

还有这个:

Error:(53, 20) error: Cannot find getter for field. Error:(56, 20) error: Cannot find getter for field. Error:(60, 20) error: Cannot find getter for field. Error:(63, 20) error: Cannot find getter for field.

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

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

来源:Android Developers

试试这个:-

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

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

 @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(){

}

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

在我的例子中,我必须将 class 更改为:

@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)