Android,使用嵌入对象列表的ROOM查询

5

我正在使用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个回答

3
我会使用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中的关系的更多信息,请查看此文档


2

我的解决方案如下:

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

但我不喜欢它,我更喜欢更好的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接