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

时间:2018-01-15 19:33:56

标签: java android android-room

我正在尝试通过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;
}
}

我得到的错误:

  

错误:(14,4)错误:实体和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。

4 个答案:

答案 0 :(得分:8)

我在这里发布答案:

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

getter的问题在于Room使用JavaBeans约定作为其名称,因此例如我的getuUsername()应该是getUUsername()。在我改变了所有的getter以匹配构建成功之后。 资料来源:Android DevelopersJavaBeans Conventions

答案 1 :(得分:1)

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

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

}

答案 2 :(得分:0)

尝试:-

@Ignore
public User(int uId, String userName, String email, String 
 password){
   uId = uId;
   uUsername = userName;
   uEmail = email;
   uPassword = password;
}

public User(String userName, String email, String 
 password){
   uUsername = userName;
   uEmail = email;
   uPassword = password;
}

答案 3 :(得分:0)

另见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)