【问题标题】:Greendao entity when serialized using GSON doesn't contain related entity in Generated JSON string使用 GSON 序列化的 Greendao 实体在生成的 JSON 字符串中不包含相关实体
【发布时间】:2016-12-13 02:07:19
【问题描述】:

我有两个使用 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");



    }

}

所以在我的主要活动中,我创建了一个名为“Hospital 1”的医院对象和两个名为“Patient 1”和“Patient 2”的患者对象。现在这两名患者的关联医院为“医院1”。 patient1.getHospital() 将返回 Hospital1 对象,而 patient2.getHospital() 也将返回 Hospital1 对象。 Hospital1.getPatient() 将返回一个包含患者 1 和患者 2 对象的患者列表。

我的活动代码是->

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 字符串不包含任何 PatientList 键和包含 Patient1 和 Patient2 的 List 的对应值。生成的 JSON 字符串为:

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

因此,生成的 JSON 字符串不包含医院实体的所有属性。如何解决?

【问题讨论】:

  • 医院医院1 = daoSession1.getHospitalDao().loadByRowId(1);和患者 patient1 = daoSession1.getPatientDao().loadByRowId(1);是独立的东西,这些会返回他们自己模型的信息。这些在上述代码中的任何地方都没有相互链接
  • @UsmanRana 在它们之间定义了一对多关系...Property hospitalId = patient.addLongProperty("hospitalId").getProperty(); // 患者有一个分配的医院 patient.addToOne(hospital, hospitalId); // 医院有很多病人 ToMany hospitalToPatients = hospital.addToMany(patient, hospitalId); hospitalToPatients.setName("患者");

标签: android gson greendao


【解决方案1】:

查看Relations 文档:一对一和多对多关系在访问它们时会延迟解析

多对多关系,在首次访问时(以及重置后)解决

所以只需要在将对象转换为 Json 之前调用 hospital1.getPatients();。所以添加此行后,您的代码将如下所示。

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));
    

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2018-12-26
      • 1970-01-01
      相关资源
      最近更新 更多