我会使用FOREIGN KEY CONSTRAINT对Vehicle和Card之间的一对多关系进行建模。这样,每当您想要获取具有特定Card的Vehicle名称时,可以查询连接两个表并选择那些cardCode字符串等于参数中给定值的行上的name列。请注意保留HTML标签。
@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(就像您现在正在做的那样)将Card列表展平为字符串,或者您也可以选择使用
@Relation注释。
有关如何处理Room中的关系的更多信息,请查看此文档。