微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找具有多对一关系的实体使用错误的ID作为查询参数

如何解决查找具有多对一关系的实体使用错误的ID作为查询参数

伙计们,我需要Android上的Room方面的帮助。

在我的项目中,有两个实体,项目和计量单位。该项目只能使用一个度量单位,但是度量单位可以使用多个单位。

由于该项目的兴趣是处理该物料,因此它需要具有多对一关系,而由于Room不处理这种关系,因此我选择建立多对多关系并创建只是一个相互参照的实体,其含义相反。

数据库已经以Kg,g,L和cm的4个度量单位开始,因此记录总数为4,ids分别为1、2、3和4。

当我在数据库中插入计量单位等于Kg的第一项时,它将具有Id = 1(因为它是第一条记录),并且当我将其通知ID为1时进行搜索时,一切正常,它效果很好,它返回的度量单位为千克。

当我注册第二个项目(所以现在这个新项目的ID为2)也在那里的计量单位等于Kg时,开始出现问题。当执行搜索通知其id为2时,他返回该项目,但其计量单位等于g(克),也为代码2。

也就是说,当Room要装入要搜索的项目的结果时,将度量单位的代码视为与项目相同的代码

房间似乎没有在查看我为带有计量单位的商品创建的关系的id,但是我做的不正确,或者我是忘记了某些东西的人。

ItemEntity

@Entity(
    tableName = "item"
)
data class ItemEntity(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "item_id")
    var itemID: Long = 0,@ColumnInfo(name = "description")
    var description: String = "",@ForeignKey(
        entity = ComparationEntity::class,parentColumns = ["comparation_id"],childColumns = ["fk_comparation_id"],onDelete = ForeignKey.CASCADE
    )
    @ColumnInfo(name = "fk_comparation_id")
    var fkComparationID: Long = 0,@ColumnInfo(name = "price")
    private var price: Double = 0.0,@ColumnInfo(name = "quantity")
    var quantity: Double = 0.0,@Ignore
    private var priceUnit: Double = 0.0
) {

    fun setPrice(price: Double) {
        if (this.quantity.toFloat() != 0.00f && price.toFloat() != 0.00f) {
            priceUnit = this.price.div(this.quantity)
        }
    }

    fun getPrice() = price

    fun getPriceUnit(): Double {
        return priceUnit
    }

}

UnitMeasureEntity

@Entity(
    tableName = "unit_measure"
)
data class UnitMeasureEntity(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "un_meas_id")
    var unMeasID: Long = 0,val description: String,val acronym: String,val symbol: String

RelationItemWithUnits

@Entity(tableName = "relation_item_whit_units",primaryKeys = ["item_id","un_meas_id"])
data class RelationItemWithUnits(
    @ColumnInfo(name = "item_id")
    val itemID : Long,@ColumnInfo(name = "un_meas_id")
    val unMeasID : Long
)

ItemWithUnitMeasure

data class ItemWithUnitMeasure(
    @Embedded
    var item: ItemEntity,@Relation(
        entity = UnitMeasureEntity::class,parentColumn = "item_id",entityColumn = "un_meas_id",associateBy = Junction(RelationItemWithUnits::class)
    )
    var unitMeasureWithMeasureType: UnitMeasureWithMeasureType
)

RelationsUnitsWithMeasuresType

@Entity(tableName = "relation_units_whit_measure_type",primaryKeys = ["un_meas_id","measure_type_id"])
data class RelationsUnitsWithMeasuresType(
    @ColumnInfo(name = "un_meas_id")
    val unMeasID: Long,@ColumnInfo(name = "measure_type_id")
    val measureTypeID : Long
)

解决方法

它需要具有多对一的关系,并且由于Room不处理这种关系,因此我选择建立多对多的关系,并仅创建一个用于交叉引用的实体,以表达其含义相反

我认为您在那里误解了。 Room's documentation实际上不包含任何many-to-one关系。但是many-to-one关系在表的结构意义上与one-to-many相同。假设您有表A和表B,并且表A具有很多行,这些行与表{ {1}}。因此,这些表具有B关系。

  1. 如果要从one-to-many表中获取所有行并在A表中附加值,则可以使用one-to-one relation from Room's documentation。由于B的一行仅与A的一行有关系。
  2. 如果要获取B表中的所有行并附加B表中的绑定值列表,则可以使用one-to-many relation。由于A表中的一行与B中的许多行有关系。

因此,您无需在此处使用单独的表和A关系。 只需将many-to-many添加到unitMeasureId表中,然后使用one-to-one relation即可获得所需的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。