Я полагаю, что у вас может быть стандартный класс, который включает в себя базовые / ссылочные объекты, и его создание осуществляется с помощью объекта RoonLancamento.
Например, что-то вроде: -
class Together {
var hospital: RoomHospital? = null
var convenio: RoomConvenio? = null
var procedimento: RoomProcedimento? = null
constructor() {}
constructor(allDao: AllDao, lancamento: RoomLancamento) {
this.hospital = allDao.getRoomHospitalById(lancamento.getHospital())
this.convenio = allDao.getRoomConvenioById(lancamento.idConvenio)
this.procedimento = allDao.getRoomProcedimentoById(lancamento.idProcedimento)
}
}
Таким образом, вы запрашиваете базу данных и возвращаете объект RoomLancamento, который затем используете для создания объекта Together (экземпляр передаваемого Dao (в данном случае объект AllDao)). Создание объекта вызывает соответствующие запросы для получения соответствующего объекта в соответствии с его идентификатором.
Ниже приведен пример (но на языке Java, а не на Kotlin): -
RoomHospital.java
@Entity(tableName = "hospital_table")
public class RoomHospital {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id_hospital")
long id;
String name;
public RoomHospital(){}
@Ignore
public RoomHospital(String hospitalName) {
this.name = hospitalName;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
RoomConvenio.java
@Entity(tableName = "convenios_table")
public class RoomConvenio {
@NonNull
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id_convenio")
long id = 0;
@NonNull
@ColumnInfo(name = "nome_convenio")
String nomeConvenio;
public RoomConvenio() {}
@Ignore
public RoomConvenio(String convenioName) {
this.nomeConvenio = convenioName;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@NonNull
public String getNomeConvenio() {
return nomeConvenio;
}
public void setNomeConvenio(@NonNull String nomeConvenio) {
this.nomeConvenio = nomeConvenio;
}
}
RoomProcedimento.java
@Entity(tableName = "procedimento_table")
public class RoomProcedimento {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id_procedimento")
long id_procedimento;
String nameProcedimento;
public RoomProcedimento() {}
@Ignore
public RoomProcedimento(String procedimentoName) {
this.nameProcedimento = procedimentoName;
}
public long getId_procedimento() {
return id_procedimento;
}
public void setId_procedimento(long id_procedimento) {
this.id_procedimento = id_procedimento;
}
public String getNameProcedimento() {
return nameProcedimento;
}
public void setNameProcedimento(String nameProcedimento) {
this.nameProcedimento = nameProcedimento;
}
}
RoomLancamento.java
@Entity(tableName = "lancamentos_table")
public class RoomLancamento {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id_lancamento")
long id;
@ForeignKey(
entity = RoomHospital.class,
parentColumns = {"id_hospital"},
childColumns = {"id_hospital_FK"}
/* , onDelete = ForeignKey.SET_NULL WILL BE PROBLEMATIC */
)
@ColumnInfo(name = "hospital_FK")
long hospital;
@ForeignKey(
entity = RoomProcedimento.class,
parentColumns = {"id_procedimento"},
childColumns = {"id_procedimento_FK"}
/* ,onDelete = ForeignKey.SET_NULL */
)
@ColumnInfo(name = "id_procedimento_FK")
long idProcedimento;
@ForeignKey(
entity = RoomConvenio.class,
parentColumns = {"id_convenio"},
childColumns = {"id_convenio_FK"}
/* , onDelete = ForeignKey.SET_NULL */
)
@ColumnInfo(name = "id_convenio_FK")
long idConvenio;
public RoomLancamento() {}
@Ignore
public RoomLancamento(long hospitalId, long conevioId, long procedimentoId) {
this.hospital = hospitalId;
this.idConvenio = conevioId;
this.idProcedimento = procedimentoId;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getHospital() {
return hospital;
}
public void setHospital(long hospital) {
this.hospital = hospital;
}
public long getIdConvenio() {
return idConvenio;
}
public void setIdConvenio(long idConvenio) {
this.idConvenio = idConvenio;
}
public long getIdProcedimento() {
return idProcedimento;
}
public void setIdProcedimento(long idProcedimento) {
this.idProcedimento = idProcedimento;
}
}
AllDao.java
@Dao
public interface AllDao {
@Insert
long[] insertRoomHospitals(RoomHospital... roomHospitals);
@Insert
long insertRoomHospital(RoomHospital roomHospital);
@Query("SELECT * FROM hospital_table WHERE id_hospital = :hospitalId")
RoomHospital getRoomHospitalById(long hospitalId);
@Query("SELECT count() FROM hospital_table")
int getRoomHospitalRowCount();
@Insert
long[] insertRoomConvenios(RoomConvenio... roomConvenios);
@Insert
long insertRoomConvenio(RoomConvenio roomConvenio);
@Query("SELECT * FROM convenios_table WHERE id_convenio = :convenioId")
RoomConvenio getRoomConvenioById(long convenioId);
@Insert
long[] insertRoomProcedimentos(RoomProcedimento... roomProcedimentos);
@Insert
long insertRoomProcedimento(RoomProcedimento roomProcedimento);
@Query("SELECT * FROM procedimento_table WHERE id_procedimento = :procedimentoId")
RoomProcedimento getRoomProcedimentoById(long procedimentoId);
@Insert
long insertRoomLancamento(RoomLancamento roomLancamento);
@Query("SELECT * FROM lancamentos_table")
List<RoomLancamento> getAllLancamentos();
}
AllTogether.java
public class AllTogether {
private RoomHospital hospital;
private RoomConvenio convenio;
private RoomProcedimento procedimento;
public AllTogether() {}
public AllTogether(AllDao allDao, RoomLancamento lancamento) {
this.hospital = allDao.getRoomHospitalById(lancamento.getHospital());
this.convenio = allDao.getRoomConvenioById(lancamento.idConvenio);
this.procedimento = allDao.getRoomProcedimentoById(lancamento.idProcedimento);
}
public RoomHospital getHospital() {
return hospital;
}
public void setHospital(RoomHospital hospital) {
this.hospital = hospital;
}
public RoomConvenio getConvenio() {
return convenio;
}
public void setConvenio(RoomConvenio convenio) {
this.convenio = convenio;
}
public RoomProcedimento getProcedimento() {
return procedimento;
}
public void setProcedimento(RoomProcedimento procedimento) {
this.procedimento = procedimento;
}
}
TheDatabase.java
@Database(version = 1, entities = {
RoomHospital.class,
RoomConvenio.class,
RoomProcedimento.class,
RoomLancamento.class
})
public abstract class TheDatabase extends RoomDatabase {
abstract AllDao allDao();
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
TheDatabase db;
AllDao allDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = Room.databaseBuilder(this,TheDatabase.class,"mydb")
.allowMainThreadQueries()
.build();
allDao = db.allDao();
addSomeData();
List<RoomLancamento> RoomLancamentosList = allDao.getAllLancamentos();
ArrayList<AllTogether> allTogetherList = new ArrayList<>();
for (RoomLancamento rl: RoomLancamentosList) {
allTogetherList.add(new AllTogether(allDao,rl));
}
for (AllTogether a: allTogetherList) {
Log.d(
"AINFO",
"Hospital is " + (a.getHospital()).getName() +
"\n\tConvenio is " + (a.getConvenio()).getNomeConvenio() +
"\n\tProcedimento is " + (a.getProcedimento()).getNameProcedimento());
}
}
private void addSomeData() {
if(allDao.getRoomHospitalRowCount() < 1) {
RoomHospital[] hospitals = new RoomHospital[]{
};
allDao.insertRoomHospitals(new RoomHospital[]
{
new RoomHospital("Hospital 1"),
new RoomHospital("Hospital 2"),
new RoomHospital("Hospital 3")
});
allDao.insertRoomConvenios(new RoomConvenio[]
{
new RoomConvenio("Conv 1"),
new RoomConvenio("Conv 2"),
new RoomConvenio(" Conv 3")
});
allDao.insertRoomProcedimentos(new RoomProcedimento[]
{
new RoomProcedimento("Proc 1"),
new RoomProcedimento("Proc 2"),
new RoomProcedimento("Proc 3")
});
allDao.insertRoomLancamento(new RoomLancamento(2,1,3));
allDao.insertRoomLancamento(new RoomLancamento(1,1,1));
}
}
}
Это при запуске: -
- создает базу данных
- Вызывает метод addSomeData для загрузки некоторых данных, которых не существует.
- 3 больницы, 3 Convenios, 3 Procedimentos и 2 Lancamentos.
- Затем извлекается список Lancamentos (все 2 из них).
- Создается пустой ArrayList.
- Затем список Lancamentos циклически создается при создании соответствующих объектов AllTogether.
- Затем результирующие объекты ArrayList of AllTogether циклически выводятся через выходные данные Hospital, Convenio иИмена процедур в журнал.
В результате вышеприведенных результатов ожидаемый результат: -
2019-09-30 16:10:19.546 D/AINFO: Hospital is Hospital 2
Convenio is Conv 1
Procedimento is Proc 3
2019-09-30 16:10:19.546 D/AINFO: Hospital is Hospital 1
Convenio is Conv 1
Procedimento is Proc 1