我正在尝试通过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。
答案 0 :(得分:8)
我在这里发布答案:
对于我的第一个问题,正如CommonsWare和rmlan所建议的那样,是改变构造函数中的参数名称以匹配变量。
getter的问题在于Room使用JavaBeans约定作为其名称,因此例如我的getuUsername()应该是getUUsername()。在我改变了所有的getter以匹配构建成功之后。 资料来源:Android Developers和JavaBeans 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)
。