Как я могу выбрать два столбца с одинаковым именем в соединении с помощью ROOM? - PullRequest
0 голосов
/ 11 июня 2019

Я делаю приложение для Android, которое использует пространство для создания и управления базой данных, мне нужно сделать соединение между двумя таблицами, имеющими столбцы с одинаковым именем (первичный ключ в обеих таблицах называется «id»).Я использовал POJO для хранения возвращенных кортежей, но он может содержать только один идентификатор (мне нужны оба идентификатора, но возвращается только Toma.id).

Мой запрос на объединение:

@Query("SELECT Toma.id, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = :id")
fun getTomasDia(id: Int?) :  LiveData<List<JoinTomasDelDia>>

Мой POJO:

data class JoinTomasDelDia(
        @ColumnInfo(name = "id") val id: Int?,
        @ColumnInfo(name = "horaToma") val horaToma: String?,
        @ColumnInfo(name = "statusToma") var statusToma: Int?,
        @ColumnInfo(name = "nombreMedicamento") val medicamento: String?,
        @ColumnInfo(name = "tipo") val tipo: String?,
        @ColumnInfo(name = "titulo") val tituloTratamiento: String?,
        @ColumnInfo(name = "color") val color: Int?,
        @ColumnInfo(name = "Tratamiento.id") val idTratamiento: Int?
)

Я пытался использовать Toma.id и Tratamiento.id в Запросе, а также в имени @ColumnInfo для обоих идентификаторов, но возвращается только Toma.id, Tratamiento.idвозвращая ноль.

Мои сущности:

@Entity(foreignKeys = arrayOf(
        ForeignKey(entity = Tratamiento::class,
                parentColumns = arrayOf("id"),
                childColumns = arrayOf("tratamientoID"),
                onDelete = ForeignKey.CASCADE
                )
))
class Toma(@PrimaryKey(autoGenerate = true) var id: Int,
    var statusToma : Int = 0,
    var horaToma: String? = null,
    var tratamientoID: Int? = null

    )

@Entity(foreignKeys =  arrayOf(
        ForeignKey(entity = Medicamento::class,
                    parentColumns = arrayOf("id"),
                    childColumns = arrayOf("medicamentoID"),
                    onDelete = ForeignKey.CASCADE),

        ForeignKey(entity = Usuario::class,
                parentColumns = arrayOf("uid"),
                childColumns = arrayOf("usuarioID"),
                onDelete = ForeignKey.CASCADE
                )
))

class Tratamiento (@PrimaryKey(autoGenerate = true) var id: Int,
                   var titulo: String? = null,
                   var usuarioID: Int? = null,
                   var medicamentoID: Int? = null,
                   var indicaciones: String? = null,
                   var fechaInicio: String? = null,
                   var fechaFin: String? = null,
                   var diasTratamiento: Int = 0,
                   var status: Int? = null,
                   var recordatorio: Int? = null,
                   var atiempo: Int? = null,
                   var pospuestas: Int? = null,
                   var omitidas: Int? = null)


@Entity(foreignKeys = arrayOf(ForeignKey(entity = Usuario::class,
                        parentColumns = arrayOf("uid"),
                        childColumns = arrayOf("usuarioID"),
                        onDelete = ForeignKey.CASCADE)))
data class Medicamento (@PrimaryKey(autoGenerate = true) var id: Int,
                   var nombreMedicamento: String? = null,
                   var nombreGenerico: String? = null,
                   var dosis: String? = null,
                   var nota: String? = null,
                   var tipo: String? = null,
                   var color: Int? = null,
                   var fotografia: String? = null,
                   var usuarioID : Int? = null)

Я выполнил объединение с использованием DB Broser для SQLite и отлично работает:

SELECT Toma.id, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = 1

Как решить эту проблему в Android с помощью Room?

1 Ответ

1 голос
/ 11 июня 2019

Может быть, попробуйте это. Обновите свой запрос, чтобы включить оба идентификатора в качестве различных псевдонимов.

@Query("SELECT Toma.id as tomaId, statusToma, horaToma, nombreMedicamento, tipo, titulo, color, Tratamiento.id as trataminetoId FROM TOMA JOIN Tratamiento ON Tratamiento.id = Toma.tratamientoID JOIN Medicamento ON Tratamiento.medicamentoID = Medicamento.id WHERE Tratamiento.usuarioID = :id")
fun getTomasDia(id: Int?) :  LiveData<List<JoinTomasDelDia>>

И обновите свою сущность, чтобы иметь оба идентификатора.

data class JoinTomasDelDia(
    @ColumnInfo(name = "tomaId") val id: Int?,
    @ColumnInfo(name = "trataminetoId") val id2: Int?,
    @ColumnInfo(name = "horaToma") val horaToma: String?,
    @ColumnInfo(name = "statusToma") var statusToma: Int?,
    @ColumnInfo(name = "nombreMedicamento") val medicamento: String?,
    @ColumnInfo(name = "tipo") val tipo: String?,
    @ColumnInfo(name = "titulo") val tituloTratamiento: String?,
    @ColumnInfo(name = "color") val color: Int?,
    @ColumnInfo(name = "Tratamiento.id") val idTratamiento: Int?
)
...