Android 具有多对一关系的查找实体对查询参数使用了错误的id

Android 具有多对一关系的查找实体对查询参数使用了错误的id,android,sqlite,android-room,Android,Sqlite,Android Room,听着,伙计们,我需要一些关于Android空间的帮助 在我的项目中有两个实体,项目和度量单位。项目只能采用一个度量单位,但度量单位可以采用多个单位 由于项目的目的是处理项目,它需要有多对一的关系,而Room没有处理这一点,因此我选择建立多对多关系,只创建一个实体进行交叉引用,以呈现相反的含义 数据库已经开始使用4个测量单位,Kg、g、L和cm,因此记录总数为4,ID分别为1、2、3和4 当我在数据库中插入测量单位为Kg的第一个项目时,它的Id=1(因为它是第一条记录),当我搜索它时,它通知Id

听着,伙计们,我需要一些关于Android空间的帮助

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

由于项目的目的是处理项目,它需要有多对一的关系,而Room没有处理这一点,因此我选择建立多对多关系,只创建一个实体进行交叉引用,以呈现相反的含义

数据库已经开始使用4个测量单位,Kg、g、L和cm,因此记录总数为4,ID分别为1、2、3和4

当我在数据库中插入测量单位为Kg的第一个项目时,它的Id=1(因为它是第一条记录),当我搜索它时,它通知Id 1,一切正常,工作正常,它返回测量单位为Kg的项目

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

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

Room似乎没有查看我为带有度量单位的项目创建的关系的id,但我做得不对,或者是我忘了什么

项目实体

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

}
@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
UnitMeasureEntity

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

}
@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
)

与单位的关系项

@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
)
@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
)
与测量类型的关系

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
)
@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没有处理这个问题,我选择建立一个多对多的关系,只创建一个实体来进行交叉引用,呈现相反的含义

我认为你在这方面有误解。实际上不包括任何
多对一
关系。但是
多对一
关系在表的结构意义上与
一对多
相同。假设您有表
A
和表
B
,表
A
有许多行具有表
B
中相同的id。因此,表包含一对多关系

  • 如果要从
    A
    表中获取所有行,并从
    B
    表中附加值,可以使用。因为
    A
    中的一行仅与
    B
    中的一行相关
  • 如果要从
    B
    表中获取所有行,并从
    A
    表中附加绑定值列表,可以使用。因为
    B
    表中的一行与
    a
    中的多行有关系
  • 因此,这里不需要使用单独的表和多对多关系。 只需将
    unitMeasureId
    添加到
    itemtentity
    表中,然后使用它来获得所需的结果,就会容易得多