Использование встроенного класса POJO в аннотированном объекте Green Dao - PullRequest
0 голосов
/ 26 марта 2019

Я хочу использовать встроенный класс POJO в моем постоянном объекте.

Это необходимо для соответствия модели данных сервера в моем приложении для Android.Приложение, использующее инфраструктуру GreeanDao для слоя БД 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 */
}

1 Ответ

0 голосов
/ 01 апреля 2019

Я понял это с помощью аналогичного метода, но с небольшими изменениями. Я продолжаю использовать аннотацию 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 */
}
...