entity - 房间 Android : Entities and Pojos must have a usable public constructor

标签 entity parcelable android-room

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)

正在将 room 整合到我现有的项目中。在使用 @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;
    }
}

最佳答案

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

注释其中一个

@Ignore

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);
}
}

关于entity - 房间 Android : Entities and Pojos must have a usable public constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44604625/

相关文章:

android - Proguard 和 Object extends Parcelable - 解码时找不到类

android - 从 parcelable、contentView 或 contentIntent 中提取通知文本

android - 如何解析 Kotlin 中 Room 库的注解?

java - JPA - 实体设计问题

database-design - 如何不在休眠中创建列包括实体类中的一些属性

dependency-injection - NestJS : Inject Service into Models/Entities

android - 尝试使用 Observable 时获取 Fata 信号 11

java - Spring : injecting data object in service

android - Parcelable - 无法从参数化类型中选择

android - 如何一个接一个地合并两个实时数据?