使用 GSON 序列化时的 Greendao 实体在生成的 JSON 字符串中不包含相关实体
Greendao entity when serialized using GSON doesn't contain related entity in Generated JSON string
我有两个使用 Greendao 生成器生成的实体。这两个实体是 Hospital 和 Patient。 Hospital 和 Patient 之间存在一对多的关系。所以一个医院可以有多个病人,一个病人只能有一个医院。因此,医院将包含患者列表。
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");
}
}
所以在我的主要 activity 中,我创建了一个名为 "Hospital 1" 的医院对象和两个名为 "Patient 1" 和 "Patient 2" 的患者对象。现在这两位患者的关联医院是"Hospital 1"。 patient1.getHospital() 会 return Hospital1 对象,patient2.getHospital() 也会 return Hospital1 对象。
Hospital1.getPatient() 将 return 包含 patient1 和 patient2 对象的患者列表。
我的 activity 代码是 ->
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.The 生成的 JSON 字符串的对应值是:
{
"Hospital_Name":"Hospital 1", "id":1
}
因此生成的 JSON 字符串不包含医院实体的所有属性。如何解决这个问题?
查看 Relations 文档:一对一和对多关系在访问它们时延迟解析
一对多关系,在第一次访问时解决(以及重置后)
所以只需要在将对象转换为 Json.So 之前调用 hospital1.getPatients(); 添加此行后,您的代码将如下所示。
Hospital hospital1 = daoSession1.getHospitalDao().loadByRowId(1);
hospital1.getPatients();
Gson gson = new Gson();
Log.e("msg", gson.toJson(hospital1));
希望能解决你的问题
首先,您的 Hospital
class 需要有一个列表参数才能保存患者对象。它可以是 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));
我有两个使用 Greendao 生成器生成的实体。这两个实体是 Hospital 和 Patient。 Hospital 和 Patient 之间存在一对多的关系。所以一个医院可以有多个病人,一个病人只能有一个医院。因此,医院将包含患者列表。
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");
}
}
所以在我的主要 activity 中,我创建了一个名为 "Hospital 1" 的医院对象和两个名为 "Patient 1" 和 "Patient 2" 的患者对象。现在这两位患者的关联医院是"Hospital 1"。 patient1.getHospital() 会 return Hospital1 对象,patient2.getHospital() 也会 return Hospital1 对象。 Hospital1.getPatient() 将 return 包含 patient1 和 patient2 对象的患者列表。
我的 activity 代码是 ->
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.The 生成的 JSON 字符串的对应值是:
{
"Hospital_Name":"Hospital 1", "id":1
}
因此生成的 JSON 字符串不包含医院实体的所有属性。如何解决这个问题?
查看 Relations 文档:一对一和对多关系在访问它们时延迟解析
一对多关系,在第一次访问时解决(以及重置后)
所以只需要在将对象转换为 Json.So 之前调用 hospital1.getPatients(); 添加此行后,您的代码将如下所示。
Hospital hospital1 = daoSession1.getHospitalDao().loadByRowId(1);
hospital1.getPatients();
Gson gson = new Gson();
Log.e("msg", gson.toJson(hospital1));
希望能解决你的问题
首先,您的 Hospital
class 需要有一个列表参数才能保存患者对象。它可以是 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));