Объект Greendao при сериализации с использованием GSON не содержит связанного объекта в строке Generated JSON

У меня есть два объекта, сгенерированные с использованием генератора Greendao. Эти две организации - больница и пациент. Между больницей и пациентом существует взаимосвязь от одного до многих. Таким образом, в одной больнице может быть несколько пациентов, а у одного пациента может быть только одна больница. Таким образом, больница будет содержать список пациентов.

Код для greendao Генератор →

package com.myapp.generator;


import org.greenrobot.greendao.generator.DaoGenerator;
import org.greenrobot.greendao.generator.Entity;
import org.greenrobot.greendao.generator.Property;
import org.greenrobot.greendao.generator.Schema;
import org.greenrobot.greendao.generator.ToMany;



public class MyClass {
    public static void main(String[] args) throws Exception {
        Schema schema = new Schema(1, "com.example.mohit.greendaotest.db");
        Entity hospital = schema.addEntity("Hospital");
        hospital.addIdProperty().autoincrement();
        hospital.addStringProperty("Hospital_Name");

        Entity patient=schema.addEntity("Patient");
        patient.addIdProperty().autoincrement();
        patient.addStringProperty("Patient_Name");

        Property hospitalId = patient.addLongProperty("hospitalId").getProperty();

        // patient has a one assigned hospital
        patient.addToOne(hospital, hospitalId);

        // hospital has many patients
        ToMany hospitalToPatients = hospital.addToMany(patient, hospitalId);
        hospitalToPatients.setName("patients");



        DaoGenerator dg=new DaoGenerator();
        dg.generateAll(schema,"./app/src/main/java");



    }

}

Итак, в моей основной деятельности я создал один объект больницы под названием "Больница 1" и два объекта пациента под названием "Пациент 1" и "Пациент 2". Теперь у двух пациентов есть больница №1 в качестве родственной больницы. patient1.getHospital() вернет объект Hospital1 и patient2.getHospital() также вернет объект Hospital1. Hospital1.getPatient() вернет список пациентов, содержащих как пациента1, так и объект patient2.

Мой код активности →

import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;


import com.google.gson.Gson;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "lease-db", null);
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        DaoSession daoSession = daoMaster.newSession();

        Hospital hospital = new Hospital();
        hospital.setHospital_Name("Hospital 1");

        long hospital_id = daoSession.getHospitalDao().insert(hospital);

        Patient patient1 = new Patient();
        patient1.setPatient_Name("Patient 1");

        Patient patient2 = new Patient();
        patient2.setPatient_Name("Patient 2");


        patient1.setHospitalId(hospital_id);

        patient2.setHospitalId(hospital_id);

        /*patient1.setHospital(hospital);
        patient2.setHospital(hospital);*/

        daoSession.getPatientDao().insert(patient1);
        daoSession.getPatientDao().insert(patient2);


       /* daoSession.getHospitalDao().load(hospital_id).getPatients().add(patient1);
        daoSession.getHospitalDao().load(hospital_id).getPatients().add(patient2);

        daoSession.getHospitalDao().update(daoSession.getHospitalDao().load(hospital_id));*/


        daoSession.clear();

        DaoSession daoSession1 = daoMaster.newSession();

        Hospital hospital1 = daoSession1.getHospitalDao().loadByRowId(1);


        Gson gson = new Gson();
        Log.e("msg", gson.toJson(hospital1));





        /*Toast.makeText(this,String.valueOf(daoSession1.getPatientDao().loadAll().size()),Toast.LENGTH_SHORT).show();
*/


    }
}

Однако, когда я извлекаю объект Hospital1 из базы данных и извлекаю его с помощью GSON. Сгенерированная строка JSON не содержит ключа пользователя и соответствующего значения списка, содержащего Patient1 и Patient2.Сгенерированная строка JSON:

{
            "Hospital_Name":"Hospital 1", "id":1
}

Таким образом, созданная строка JSON не содержит всех атрибутов объекта больницы. Как решить эту проблему?

Ответ 1

Посмотрите Relations docs: отношения "один" и "многие" разрешаются лениво, при доступе к ним

Отношение "многие", разрешенное при первом доступе (и после reset)

Так просто нужно вызвать hospital1.getPatients();, прежде чем преобразовать объект в Json.So. После добавления этой строки ваш код будет выглядеть ниже.

Hospital hospital1 = daoSession1.getHospitalDao().loadByRowId(1);
hospital1.getPatients();

Gson gson = new Gson();
Log.e("msg", gson.toJson(hospital1));

Я надеюсь, что это решит вашу проблему.

Ответ 2

Прежде всего, ваш класс Hospital должен иметь параметр списка для хранения объектов пациента. Это может быть ArrayList<Patinet>, тогда вам нужно получить список пациентов из базы данных,

Hospital hospital1 = daoSession1.getHospitalDao().loadByRowId(1);

//This block can change according to your design
ArrayList<Patient> patinets = daoSession.getPatientDao().getPatients(hospital1.getId());

hospital1.setPatinets(patinets);
Gson gson = new Gson();
Log.e("msg", gson.toJson(hospital1));