首页 > 解决方案 > 在 Green Dao 注释实体中使用 Embedded POJO 类

问题描述

我想在我的持久实体中使用嵌入式 POJO 类。

需要匹配我的 android 应用程序中的服务器数据模型。应用程序使用 GreeanDao 框架作为 DB DAO 层和自写的基于注释的库与服务器进行数据交换* *我只想提一下,重写库以匹配限制也是一种解决方案,但在此之前,我想弄清楚如果有自然的方式或现有的用例。

我相信我可以@Transient在我的 POJO 字段中使用注释并将 POJO 字段的副本保留在 Entity 类中,而不仅仅是弄乱复制字段的设置器和构造函数 Green Daou 依赖于初始化 POJO 字段。但如果你问我,这听起来有点笨拙。

public class Person{
        private String firstName, secondName;
        private int age;
        /* getters and setters */
    }
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Keep;
import org.greenrobot.greendao.annotation.Property;
import org.greenrobot.greendao.annotation.Transient;
import org.greenrobot.greendao.annotation.Generated;

@Entity
public class Employee {
    @Id(autoincrement = true)
    private long id;
    @Transient
    private Person person;
    @Property(nameInDb = "PERSON_FIRST_NAME")
    private String firstName;
    @Property(nameInDb = "PERSON_SECOND_NAME")
    private String secondName;
    @Property(nameInDb = "PERSON_AGE")
    private int age;


    @Keep
    public Employee(long id, String firstName, String secondName, int age) {
        this.id = id;
        this.firstName = firstName;
        this.secondName = secondName;
        this.age = age;
        initPerson();
    }

    @Generated(hash = 202356944)
    public Employee() {
    }

    private void initPerson(){
        if(this.person == null)
            this.person = new Person();
        person.setFirstName(this.firstName);
        person.setSecondName(this.secondName);
        person.setAge(this.age);
    }


    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
        this.setAge(person.getAge());
        this.setFirstName(person.getFirstName());
        this.setSecondName(person.getSecondName());
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        initPerson();
    }

    public void setSecondName(String secondName) {
        this.secondName = secondName;
        initPerson();
    }

    public void setAge(int age) {
        this.age = age;
        initPerson();
    }
    /* some getters etc */
}

标签: androidgreendao

解决方案


我用类似的方法解决了这个问题,但几乎没有修改。我一直使用注释 ToOne。检查字符串 personId 而不是 person 很重要。

@Entity
public class Employee {
    @Id(autoincrement = true)
    private long id;
    private String personId;
    @ToOne(joinProperty = "personId")
    private Person person;

    @Keep
    public Employee(long id) {
        this.id = id;
        initPerson();
    }

    @Generated(hash = 202356944)
    public Employee() {
    }

    private void initPerson() {
        if (this.personId == null){
        Person person = new Person();
        person.setFirstName(this.firstName);
        person.setSecondName(this.secondName);
        person.setAge(this.age);
        setPerson(person)
        }
    }
     /** called by internal mechanisms, do not call yourself. */
@Generated(hash = 472550346)
public void setPerson(Person person) {
    synchronized (this) {
        this.person= person;
        personId = person == null ? null : person.getId();
        person__resolvedKey = personId;
    }
}
    /* some getters etc */
}

推荐阅读