在Green Dao注释实体中使用嵌入式POJO类

问题描述 投票:0回答:1

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

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

我相信我可以在我的POJO字段中使用@Transient注释,并在实体类中保留POJO字段的副本,而不仅仅是弄乱复制字段和构造函数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 */
}
android greendao
1个回答
0
投票

我用类似的方法想出了这一点,但几乎没有修改。我一直使用注释ToOne。检查String 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 */
}
© www.soinside.com 2019 - 2024. All rights reserved.