错误:实体和Pojos必须具有可用的公共构造函数,并且无法找到字段

时间:2017-10-05 20:14:36

标签: android android-room android-architecture-components

我是android架构组件的新手。我正在尝试使用相同的 Gradle 配置引用android-architecture-components/BasicRxJavaSample来构建应用。但我得到以下错误..

  • 错误:(14,4)错误:实体和Pojos必须具有可用的公共构造函数。您可以拥有一个空构造函数或其参数与字段匹配的构造函数(按名称和类型)。使用以下构造函数但它们无法匹配:= Department(java.lang.String,java.lang.String):[id: null,dep:null]
  • 错误:(16,20)错误:无法找到字段的setter。
  • 错误:(18,20)错误:无法找到字段的setter。

我正在为所有架构组件使用版本“1.0.0-alpha9”。我也尝试过当前的“1.0.0-beta1”版本。

我已经看过[场上的模糊吸气...房间持久性库 2也链接,但根据谷歌示例不需要为每个字段设置。

模型类

    @Entity(tableName = "tblDepartment")
public class Department{
    @PrimaryKey
    private String mId;

    private String mName;

    @Ignore
    public Department(String dep) {
        mId= UUID.randomUUID().toString();
        mName= dep;
    }
    public Department(String id, String dep) {
        mId = id;
        mName=dep;
    }

    public String getDepartmentId() {
        return mId;
    }

    public String getDepartmentName() {
        return mName;
    }
}

3 个答案:

答案 0 :(得分:3)

您的问题是您的getter / setter与您的字段名称不匹配,所以目前您有:

private String mId;

public String getId() {}

Room预处理器正在查看您的类并且未能找到mId字段的getter / setter,因为它期望public String getMId()与构造函数相同,参数名称与字段名称不匹配所以它找不到有效的构造函数。

答案 1 :(得分:0)

你需要一个有效的构造函数。

您通过Room存储的所有字段的getter / setter。

尝试:

@Entity(tableName = "tblDepartment")
public class Department{
@PrimaryKey
private String mId;

private String mName;

@Ignore
public Department(String mName) {
    mId= UUID.randomUUID().toString();
    this.mName= mName;
}
public Department(String id, String name) {
    this.mId = mId;
    this.mName=mName;
}

public String getId() {
    return mId;
}

public String getName() {
    return mName;
}
public void setId(String mId){ this.mId = mId; }
public void setName(String mName){ this.mName = mName; }
} 

答案 2 :(得分:0)

您也可以尝试以下操作:-

@Ignore
public Department(int mId, String mName) {
   this.mId= mId;
   this.mName= mName;
}

public Department(String mName) {
   this.mName= mName;
}