Android, ROOM-запрос со встроенным списком объектов - PullRequest
0 голосов
/ 02 октября 2019

Я использую ROOM, и я пытаюсь получить имя транспортного средства с определенным Card.Code.

классами сущностей, подобными этому

@Entity(tableName = "vehicles")
data class Vehicle(
    @PrimaryKey
    @ColumnInfo(name = "id") val id: Int,
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "cards") val cards: List<Card>?
)

@Entity
data class Card(
    @ColumnInfo(name = "id") val id: Int,
    @ColumnInfo(name = "code") val code: String
)

моя проблемачто я не знаю, как правильно написать запрос SQL

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Я бы смоделировал One-to-Many Relationship между Vehicle и Card, используя FOREIGN KEY CONSTRAINT. Затем, всякий раз, когда вы хотите получить имя Vehicle, которое имеет определенный Card, вы можете сделать запрос, который объединяет обе таблицы и выбирает столбец name в тех строках, в которых строка cardCode равна указаннойв аргументе.

@Entity(tableName = "vehicles")
data class Vehicle(
    @PrimaryKey
    @ColumnInfo(name = "id") val id: Int,
    @ColumnInfo(name = "name") val name: String
)
@Entity(foreignKeys = arrayOf(ForeignKey(
            entity = Vehicle::class,
            parentColumns = arrayOf("id"),
            childColumns = arrayOf("vehicle_id"))
       )
)
data class Card(
    @PrimaryKey
    @ColumnInfo(name = "id") val cardId: Int,
    @ColumnInfo(name = "code") val code: String,
    @ColumnInfo(name = "vehicle_id") val vehicleId: Int,
)
@Query("SELECT vehicles.name
 FROM vehicles, card 
 WHERE vehicles.id == card.vehicle_id
 AND card.code == :cardCode")
fun getVehicleNameOfCard(cardCode: String): String?

Так как Room не ORM, а просто оболочка SQLite, он не обрабатывает встроенные списки объектов для вас. Вы можете либо сгладить список карт в строку, используя TypeConverter (как я думаю, вы делаете сейчас), либо вы также можете использовать аннотацию @ Relation .

Для получения дополнительной информации о том, как обращаться с Отношениями в Комнате, вы можете проверить эту документацию .

0 голосов
/ 02 октября 2019

у меня такое решение

@Query("SELECT name FROM vehicles WHERE cards LIKE '%' || :cardCode || '%'")
fun getVehicleNameOfCard(cardCode: String): String?

но мне это не нравится и я предпочитаю что-то лучше

...