2016-12-13 48 views
12

Mam dwie jednostki wygenerowane przy użyciu generatora Greendao. Te dwie jednostki to Szpital i Pacjent. Istnieje jeden do wielu relacji między Szpitalem a Pacjentem. Zatem jeden szpital może mieć wielu pacjentów, a jeden Pacjent może mieć tylko jeden szpital. Tak więc szpital będzie zawierał listę pacjentów.Jednostka Greendao w przypadku serializacji za pomocą GSON nie zawiera pokrewnej jednostki w wygenerowanym ciągu JSON

Kod greendao Generator IS->

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



    } 

} 

Więc w moim głównej działalności i stworzyliśmy jeden szpital Obiekt o nazwie „Szpital 1” i dwa pacjent obiekt o nazwie „Pacjent 1” i „Pacjent 2”. Teraz dwoje pacjentów ma "Szpital 1" jako ich powiązany szpital. patient1.getHospital() zwróci obiekt Hospital1, a patient2.getHospital() zwróci obiekt Hospital1. Hospital1.getPatient() zwróciłaby listę pacjentów zawierających zarówno obiekt pacjenta1, jak i pacjenta2.

Moja działalność jest kod ->

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(); 
*/ 


    } 
} 

Jednak kiedy odzyskać Hospital1 obiekt z bazy danych i pobrać go za pomocą GSON. Wygenerowany ciąg JSON nie zawiera żadnego klucza patientList i odpowiednią wartość listy zawierającej Patient1 i Patient2.The generowane JSON ciąg jest:

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

Więc Generated JSON String nie zawiera wszystkie atrybuty Szpitala Podmiotu . Jak rozwiązać ten problem?

+0

Szpital hospital1 = daoSession1.getHospitalDao() loadByRowId (1).; i pacjent pacjenta 1 = daoSession1.getPatientDao(). loadByRowId (1); są oddzielnymi rzeczami, które zwrócą informacje o ich własnych modelach. Nie są one ze sobą powiązane nigdzie w wyżej wymienionym kodzie –

+0

@UsmanRana między wieloma zdefiniowano relację między nimi ... Property hospitalId = patient.addLongProperty ("hospitalId"). GetProperty(); // pacjent ma przypisany szpital patient.addToOne (hospital, hospitalId); // szpital ma wielu pacjentów ToMany hospitalToPatients = hospital.addToMany (patient, hospitalId); hospitalToPatients.setName ("pacjenci"); –

Odpowiedz

3

Prosze spojrzeć na Relations dokumentów: do jednego i do wielu relacji są rozwiązane leniwie, na dostępie do nich

do wielu relacji, uchwalonej na pierwszym dostępu (i po resecie)

Tak wystarczy zadzwonić pod numer hospital1.getPatients(); przed konwertowaniem obiektu do Json.So Po dodaniu tego wiersza twój kod będzie wyglądał jak poniżej.

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

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

Mam nadzieję, że rozwiąże problem

3

Przede wszystkim klasa Hospital musi mieć parametr listy w celu utrzymania obiektów pacjenta. To może być ArrayList<Patinet> następnie trzeba uzyskać listę pacjentów z bazy

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