2017-06-17 11 views
1

エンティティとPojosには、使用可能なpublicコンストラクタが必要です。空のコンストラクタまたはパラメータがフィールドに一致するコンストラクタを名前と型で指定できます。Room Android:エンティティとPojosには使用可能なpublicコンストラクタが必要です

既存のプロジェクトに部屋を統合していますか。 @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; 
    } 
} 
+1

あなたは "テンプレート" クラスのコードを追加してくださいでした。私はそれがなくてもあなたのクラスをテストしました。この問題は、ArrayList –

+0

@JackDaltonの埋め込みに起因する可能性があります。 TemplateクラスとIssueクラスも含めました。 – Jai

+0

それがなくてもうまくいくでしょう。しかし、私は一度にコード全体を変更することはできません。増分更新のみ。だからこそ私はグループでこれを聞いて、誰かが回避策を知っているかもしれないと思ったのです。 – Jai

答えて

2

具体的なコンストラクターエラーが表示される理由はわかりません。あなたのコードでは、ArrayListを埋め込むことに誤りがあると言われています。 @Embeddedはこの方法で使うつもりはありません。 @EmbeddedはPOJO構造体を格納するときにその構造体を平坦化することを可能にします。ネストされたPOJOプロパティは、親POJOのプロパティであるかのように表示されます。 Listに埋め込みを使用することは、ArrayListオブジェクトのプロパティを平坦化して格納することを要求するのと同じですが、リスト項目を展開して格納するのではありません。

適切な手段は、外部キー、主キーの関係に移行することです。別の解決策は、あなたのアイテムのリストを含む新しいPOJOを作成することです(つまり、 's'付きのTemplates)。これには、TemplateオブジェクトのArrayListが含まれます。次に、POJOをjson /コンマ区切りリストに変換するコンバータを定義し、デフォルトで「テンプレート」と呼ばれる単一の列に格納します。この方法へのリンクは次のとおりです。 Android room persistent library - TypeConverter error of error: Cannot figure out how to save field to database"

+0

はい。ドキュメンテーションとビデオをもう一度読むと分かります。しかし、私はまだ外国のキーの方法が正しいかどうか、混乱していた。これは、私にとって緑色の信号のようなものです。 – Jai

+0

私の解決策を更新しました –

+0

有望そうです。リンクありがとう。これを試しています。 – Jai

3

ルームでは、エンティティクラスにコンストラクタが1つしかないと想定しています。あなたは複数のコンストラクタは、このコンストラクタを無視して、エラーなしでコンパイルされます

@ignore

ルームでそれらの一つに注釈を付けている場合でも、そのような制限はありません。

@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); 
} 
} 
関連する問題