【问题标题】:Room Android : Entities and Pojos must have a usable public constructorRoom Android:实体和 Pojos 必须有一个可用的公共构造函数
【发布时间】:2017-11-20 03:19:55
【问题描述】:

实体和 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;
    }
}

【问题讨论】:

  • 能否请您为“模板”类添加代码。我已经在没有它的情况下测试了你的课程,它似乎可以工作。问题可能是由于嵌入了 ArrayList
  • @JackDalton 感谢您的宝贵时间。我也包含了模板和问题类。
  • 是的,否则它会起作用。但是我不能一次修改整个代码。只有增量更新。这就是为什么我想在小组中问这个问题,认为有人可能知道一些解决方法。

标签: entity parcelable android-room


【解决方案1】:

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

【讨论】:

    【解决方案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"

    希望这会有所帮助。

    【讨论】:

    • 是的。当我再次浏览文档和视频时,我明白了。但是我仍然很困惑,外键方法是否正确。这对我来说有点像绿色信号。
    • 更新了我的解决方案
    • 看起来很有希望。感谢您的链接。正在尝试这个。
    • 仍然对 GSON 是否能够将 JSON 响应解析为这个新的 POJO 感到困惑。澄清一下,这就像将 List 更改为一个新对象并为其定义 TypeConverters,对吧?
    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2018-10-19
    • 2019-11-03
    • 2017-11-13
    • 2019-09-14
    相关资源
    最近更新 更多