【问题标题】:Android, ROOM query with embedded list of objectsAndroid,带有嵌入式对象列表的 ROOM 查询
【发布时间】:2019-10-02 11:22:06
【问题描述】:

我正在使用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 查询

【问题讨论】:

    标签: android android-sqlite android-room


    【解决方案1】:

    我的解决方案是这样的

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

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

    【讨论】:

      【解决方案2】:

      我将使用FOREIGN KEY CONSTRAINTVehicleCard 之间建模One-to-Many Relationship。然后,每当您想获得具有特定 CardVehicle 名称时,您可以进行查询以连接两个表并在其中 cardCode 字符串等于给定行的那些行上选择 name 列在论据中。

      @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 annotation

      更多关于如何处理Room关系的信息,您可以check this documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-04
        • 2018-05-25
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多