在android中使用房间的嵌套对象?
我有4个不同的对象(RoomHospital、RoomProcedmento、RoomConvention和RoomLancamento)。前3个基本上有一个id和一个名称。最后一个应该有一个id和前面每个id的一个实例 前3个对象的示例在android中使用房间的嵌套对象?,android,kotlin,android-room,Android,Kotlin,Android Room,我有4个不同的对象(RoomHospital、RoomProcedmento、RoomConvention和RoomLancamento)。前3个基本上有一个id和一个名称。最后一个应该有一个id和前面每个id的一个实例 前3个对象的示例 @Parcelize @Entity(tableName = "convenios_table") data class RoomConvenio( @NotNull @PrimaryKey(autoGenerate = true) @
@Parcelize
@Entity(tableName = "convenios_table")
data class RoomConvenio(
@NotNull
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id_convenio")
var id: Int = 0,
@NotNull
@ColumnInfo(name = "nome_convenio")
var nomeConvenio: String
) : Parcelable
最后一个示例:
@Parcelize
@Entity(tableName = "lancamentos_table")
data class RoomLancamento(
@NotNull
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id_lancamento")
var id : Int = 0,
@NotNull
@ForeignKey(
entity = RoomHospital::class,
childColumns = ["id_hospital_FK"],
parentColumns = ["id_hospital"],
onDelete = ForeignKey.SET_NULL)
@ColumnInfo(name = "hospital_FK")
var hospital : RoomHospital,
@NotNull
@ForeignKey(
entity = RoomProcedimento::class,
parentColumns = ["id_procedimento"],
childColumns = ["id_procedimento_FK"],
onDelete = ForeignKey.SET_NULL)
@ColumnInfo(name = "id_procedimento_FK")
var idProcedimento : Int,
@NotNull
@ForeignKey(
entity = RoomConvenio::class,
parentColumns = ["id_convenio"],
childColumns = ["id_convenio_FK"],
onDelete = ForeignKey.SET_NULL)
@ColumnInfo(name = "id_convenio_FK")
var idConvenio : Int
) : Parcelable
我想要的最终结果是:
在RoomLancamento表(lancamentos_表)中,我只想引用其他表的PK ID,如:
但是当我从数据库中检索这些键时,我希望得到它们所引用的整个对象,比如:
应该如何做到这一点?我相信您可以拥有一个包含底层/引用对象的标准类,并且该实例化是通过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对象,然后使用该对象将一个对象连接在一起(一个正在传递的Dao实例(在本例中是一个AllDao对象))。构造对象调用相应的查询以根据其id检索相应的对象
以下是一个示例(但使用Java而不是Kotlin):-
RoomHospital.java
RoomConvenrio.java
roomprocedmento.java
RoomLancamento.java
java
TheDatabase.java
MainActivity.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;
}
}
@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;
}
}
@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;
}
}
@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;
}
}
@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();
}
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;
}
}
@Database(version = 1, entities = {
RoomHospital.class,
RoomConvenio.class,
RoomProcedimento.class,
RoomLancamento.class
})
public abstract class TheDatabase extends RoomDatabase {
abstract AllDao allDao();
}
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));
}
}
}
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