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 以匹配构建成功后。
试试这个:-
@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)
。
我正在尝试通过 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 以匹配构建成功后。
试试这个:-
@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)
。