Вложенные объекты с помощью Room в Android? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть 4 различных объекта (RoomHospital, RoomProcedimento, RoomConvenio и RoomLancamento). Первые 3 имеют в основном идентификатор и имя. Последний должен иметь идентификатор и экземпляр каждого из предыдущих.

Пример для первых 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_table) я хочу иметь только ссылку на другие таблицы идентификаторов PK, таких как:

How I want info to be stored

Но когда я получаю эти ключи из БД, я хочу получить весь объект, на который они ссылались, что-то вроде:

Final result expected

Как это сделать?

1 Ответ

0 голосов
/ 30 сентября 2019

Я полагаю, что у вас может быть стандартный класс, который включает в себя базовые / ссылочные объекты, и его создание осуществляется с помощью объекта 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));
        }
    }
}

Это при запуске: -

  1. создает базу данных
  2. Вызывает метод addSomeData для загрузки некоторых данных, которых не существует.
    1. 3 больницы, 3 Convenios, 3 Procedimentos и 2 Lancamentos.
  3. Затем извлекается список Lancamentos (все 2 из них).
  4. Создается пустой ArrayList.
  5. Затем список Lancamentos циклически создается при создании соответствующих объектов AllTogether.
  6. Затем результирующие объекты 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...