5

实体和 Pojos 必须有一个可用的公共构造函数。您可以有一个空的构造函数或参数与字段匹配的构造函数(按名称和类型)

我正在将房间整合到我现有的项目中。在使用 @Entity 标记注释实现 Parcelable 的 POJO 并进行必要的更改时,出现此错误。我已经有一个空的构造函数。任何帮助,将不胜感激。

@Entity(tableName = "Departments")
public class Department implements Parcelable {

    @PrimaryKey(autoGenerate = true)
    private Integer primaryId;
    private Integer id;
    private String departmentName;
    private String logoUrl;
    @Embedded
    private ArrayList<Template> templateList;

    public Department() {
    }

    protected Department(Parcel in) {
        this.primaryId = (Integer) in.readSerializable();
        this.departmentName = in.readString();
        this.logoUrl = in.readString();
        this.id = (Integer) in.readSerializable();
        this.templateList = in.createTypedArrayList(Template.CREATOR);
    }

    public static final Creator<Department> CREATOR = new Creator<Department>() {
        @Override
        public Department createFromParcel(Parcel in) {
            return new Department(in);
        }

        @Override
        public Department[] newArray(int size) {
            return new Department[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeSerializable(primaryId);
        dest.writeString(departmentName);
        dest.writeString(logoUrl);
        dest.writeSerializable(id);
        dest.writeTypedList(templateList);
    }

    public Integer getPrimaryId() {
        return primaryId;
    }

    public void setPrimaryId(Integer primaryId) {
        this.primaryId = primaryId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLogoUrl() {
        return logoUrl;
    }

    public void setLogoUrl(String logoUrl) {
        this.logoUrl = logoUrl;
    }

    public String getDepartmentName() {
        return departmentName;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }

    public ArrayList<Template> getTemplateList() {
        return templateList;
    }

    public void setTemplateList(ArrayList<Template> templateList) {
        this.templateList = templateList;
    }
}

@Entity(tableName = "Templates")
public class Template implements Parcelable {

    @PrimaryKey(autoGenerate = true)
    private Integer primaryId;

    private Integer id;
    private String code;
    private String description;
    private Integer departmentId;
    @Embedded
    private ArrayList<Issue> issueList;

    public Template() {
    }

    private Template(Parcel in) {
        this.primaryId = (Integer) in.readSerializable();
        this.code = in.readString();
        this.description = in.readString();
        this.id = (Integer) in.readSerializable();
        this.departmentId = (Integer) in.readSerializable();
        this.issueList = in.createTypedArrayList(Issue.CREATOR);
    }

    public static final Creator<Template> CREATOR = new Creator<Template>() {
        @Override
        public Template createFromParcel(Parcel in) {
            return new Template(in);
        }

        @Override
        public Template[] newArray(int size) {
            return new Template[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeSerializable(primaryId);
        dest.writeString(code);
        dest.writeString(description);
        dest.writeSerializable(id);
        dest.writeSerializable(departmentId);
        dest.writeTypedList(issueList);
    }

    public Integer getPrimaryId() {
        return primaryId;
    }

    public void setPrimaryId(Integer primaryId) {
        this.primaryId = primaryId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public ArrayList<Issue> getIssueList() {
        return issueList;
    }

    public void setIssueList(ArrayList<Issue> issueList) {
        this.issueList = issueList;
    }

    public Integer getDepartmentId() {
        return departmentId;
    }

    public void setDepartmentId(Integer departmentId) {
        this.departmentId = departmentId;
    }
}

@Entity(tableName = "Issues")
public class Issue implements Parcelable {

    @PrimaryKey(autoGenerate = true)
    private Integer primaryId;

    private Integer id;
    private String code;
    private String description;
    private Integer parentIssue;

    public Issue() {
    }

    protected Issue(Parcel in) {
        this.primaryId = (Integer) in.readSerializable();
        this.code = in.readString();
        this.description = in.readString();
        this.id = (Integer) in.readSerializable();
        this.parentIssue = (Integer) in.readSerializable();
    }

    public static final Creator<Issue> CREATOR = new Creator<Issue>() {
        @Override
        public Issue createFromParcel(Parcel in) {
            return new Issue(in);
        }

        @Override
        public Issue[] newArray(int size) {
            return new Issue[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeSerializable(primaryId);
        dest.writeString(code);
        dest.writeString(description);
        dest.writeSerializable(id);
        dest.writeSerializable(parentIssue);
    }

    public Integer getPrimaryId() {
        return primaryId;
    }

    public void setPrimaryId(Integer primaryId) {
        this.primaryId = primaryId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getParentIssue() {
        return parentIssue;
    }

    public void setParentIssue(Integer parentIssue) {
        this.parentIssue = parentIssue;
    }
}
4

2 回答 2

7

Room 假设您的实体类将只有一个构造函数。但是没有这样的限制,如果你有多个构造函数,那么用注释其中一个

@忽视

Room 将忽略此构造函数并编译没有任何错误。

例子

@Entity(tableName = "Departments")
public class Department implements Parcelable {

@PrimaryKey(autoGenerate = true)
private Integer primaryId;
private Integer id;
private String departmentName;
private String logoUrl;
@Embedded
private ArrayList<Template> templateList;

/**Room will ignore this constructor
**/
@Ignore
public Department() {
}

protected Department(Parcel in) {
    this.primaryId = (Integer) in.readSerializable();
    this.departmentName = in.readString();
    this.logoUrl = in.readString();
    this.id = (Integer) in.readSerializable();
    this.templateList = in.createTypedArrayList(Template.CREATOR);
}
}
于 2017-08-02T12:01:58.817 回答
2

我不确定您为什么会收到特定的构造函数错误。也就是说,您的代码会因嵌入 ArrayList 而出错。@Embedded 并不意味着以这种方式使用。@Embedded 允许您在存储 POJO 结构时将其展平。嵌套的 POJO 属性将显示为好像它们是父 POJO 上的属性。在 List 上使用 Embedded 与要求它展平 ArrayList 对象的属性并存储它们是一样的,而不是展平列表项并存储它们。

适当的措施是转换成外键、主键关系。另一种解决方案是创建一个新的 POJO,其中包含您的项目列表(即模板,带有“s”)。这将包含一个模板对象的 ArrayList。然后,您将定义一个将 POJO 转换为 json/逗号分隔列表的转换器,并将其存储在默认情况下称为“模板”的单个列中。这是此方法的链接: Android room persistent library - TypeConverter error of error: Cannot figure out how to save field to database”

希望这可以帮助。

于 2017-06-19T10:14:10.730 回答