如何解决查找具有多对一关系的实体使用错误的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
关系。
- 如果要从
one-to-many
表中获取所有行并在A
表中附加值,则可以使用one-to-one relation from Room's documentation。由于B
的一行仅与A
的一行有关系。 - 如果要获取
B
表中的所有行并附加B
表中的绑定值列表,则可以使用one-to-many relation。由于A
表中的一行与B
中的许多行有关系。
因此,您无需在此处使用单独的表和A
关系。
只需将many-to-many
添加到unitMeasureId
表中,然后使用one-to-one relation即可获得所需的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。