Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中使用房间的嵌套对象?_Android_Kotlin_Android Room - Fatal编程技术网

在android中使用房间的嵌套对象?

在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) @

我有4个不同的对象(RoomHospital、RoomProcedmento、RoomConvention和RoomLancamento)。前3个基本上有一个id和一个名称。最后一个应该有一个id和前面每个id的一个实例

前3个对象的示例

@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