Я бы смоделировал 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 .
Для получения дополнительной информации о том, как обращаться с Отношениями в Комнате, вы можете проверить эту документацию .