android - 如何在一个查询室android中以多对多关系在Junction表中获得额外的列
问题描述
我有很多项目的因子表,因子中的每个项目都有一个数量。下面的代码显示模型和关系。
如何定义关系模型以在一个查询中获取 Junction 表中的数量列与另外两个表并将它们映射到具有房间的模型中?
@Entity
data class Factor(
@PrimaryKey
@SerializedName("id")
var FactorId: String = "",
var description: String = "",
var discount: Float = 0f,
var receiver: Long = 0,
var tax: Float = 0f,
var transaction: Long,
var status: Status = Status.PENDING,
@Ignore
var items: Array<Item>
) : DiffUtilProperty {
override fun asSame(): Any? {
return FactorId
}
}
商品型号:
@Entity
data class Item(
@PrimaryKey
@SerializedName("id")
var ItemId: String = "",
var name: String = "",
var discount: Float = 0f,
var price: Float = 0f,
@Ignore
var quantity: Float = 0f,
var unit: String = "عدد"
)
结模型:
@Entity(
indices = [
Index("factor_id"),
Index("item_id")
],
foreignKeys = [
ForeignKey(
entity = Factor::class,
parentColumns = ["FactorId"],
childColumns = ["factor_id"],
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.RESTRICT
),
ForeignKey(
entity = Item::class,
parentColumns = ["ItemId"],
childColumns = ["item_id"],
onDelete = ForeignKey.RESTRICT,
onUpdate = ForeignKey.RESTRICT
)]
)
data class FactorItem(
@PrimaryKey val id: Long,
val factor_id: String = "",
val item_id: String = "",
var quantity: Float = 0f
): DiffUtilProperty {
override fun asSame(): Any? {
return id
}
}
data class FactorWithItem(
@Embedded var factor: Factor,
@Relation(
entityColumn = "item_id",
parentColumn = "factor_id",
associateBy = @Junction(FactorItem::class)
) val items: Array<Item>,
) : DiffUtilProperty {
override fun asSame(): Any? {
return factor.asSame()
}
}
解决方案
这变得更简单了,你可以这样做
data class FactorWithItem(
@Embedded
var factorItem: FactorItem = FactorItem(),
@Relation(
entity = Factor::class,
entityColumn = "FactorId",
parentColumn = "factor_id"
)
var factor: Factor = Factor(),
@Relation(
entity = Item::class,
entityColumn = "ItemId",
parentColumn = "item_id"
)
var items: Item = Item()
)
道的喜欢是为了使用
@Transaction
@Query("SELECT * FROM FactorItem")
fun getAllFactorsWithItemsAndFactorItems(): List<FactorWithItem>
@Transaction
@Query("SELECT * FROM FactorItem WHERE factor_id = :factorId")
fun getFactorWithItemsByFactorId(factorId: String): List<FactorWithItem>
使用测试仪确实
val i1 = Item("I1","Item 1",0f,10.50f,5f)
val i2 = Item("I2","Item 2")
val i3 = Item("I3","Item 3")
factorItemDatabase.allDao().insertItem(i1)
factorItemDatabase.allDao().insertItem(i2)
factorItemDatabase.allDao().insertItem(i3)
val i1 = Item("I1","Item 1",0f,10.50f,5f)
val i2 = Item("I2","Item 2")
val i3 = Item("I3","Item 3")
factorItemDatabase.allDao().insertItem(i1)
factorItemDatabase.allDao().insertItem(i2)
factorItemDatabase.allDao().insertItem(i3)
val f1 = Factor("F1","Factor 1")
val f2 = Factor("F2","Factor 2")
val f3 = Factor("F3","Factor 3")
factorItemDatabase.allDao().insertFactor(f1)
factorItemDatabase.allDao().insertFactor(f2)
factorItemDatabase.allDao().insertFactor(f3)
val fi_1_1 = FactorItem("F1","I1",15.67f)
val fi_1_3 = FactorItem("F1","I3",254f)
val fi_2_3 = FactorItem("F2","I3",33f)
val fi_3_1 = FactorItem("F3","I1",109f)
val fi_3_2 = FactorItem("F3","I2",133f)
val fi_3_3 = FactorItem("F3","I3",-999.99f)
factorItemDatabase.allDao().insertFactorItem(fi_1_1)
factorItemDatabase.allDao().insertFactorItem(fi_1_3)
factorItemDatabase.allDao().insertFactorItem(fi_2_3)
factorItemDatabase.allDao().insertFactorItem(fi_3_1)
factorItemDatabase.allDao().insertFactorItem(fi_3_2)
factorItemDatabase.allDao().insertFactorItem(fi_3_3)
var itemList = factorItemDatabase.allDao().getAllIetms()
var factorList = factorItemDatabase.allDao().getAllFactors()
var factorItemList = factorItemDatabase.allDao().getAllFactorItems()
var fwiList = factorItemDatabase.allDao().getAllFactorsWithItemsAndFactorItems()
for (fwi: FactorWithItem in fwiList) {
Log.d("FWIALL","Factor is " + fwi.factor.description + " Item is " + fwi.items.name + " FWI QTY = " + fwi.factorItem.quantity)
}
fwiList = factorItemDatabase.allDao().getFactorWithItemsByFactorId("F3")
for (fwi: FactorWithItem in fwiList) {
Log.d("FWIBYFACTOR","Factor is " + fwi.factor.description + " Item is " + fwi.items.name + " FWI QTY = " + fwi.factorItem.quantity)
}
获取日志是
D/FWIALL: Factor is Factor 1 Item is Item 1 FWI QTY = 15.67
D/FWIALL: Factor is Factor 1 Item is Item 3 FWI QTY = 254.0
D/FWIALL: Factor is Factor 2 Item is Item 3 FWI QTY = 33.0
D/FWIALL: Factor is Factor 3 Item is Item 1 FWI QTY = 109.0
D/FWIALL: Factor is Factor 3 Item is Item 2 FWI QTY = 133.0
D/FWIALL: Factor is Factor 3 Item is Item 3 FWI QTY = -999.99
D/FWIBYFACTOR: Factor is Factor 3 Item is Item 1 FWI QTY = 109.0
D/FWIBYFACTOR: Factor is Factor 3 Item is Item 2 FWI QTY = 133.0
D/FWIBYFACTOR: Factor is Factor 3 Item is Item 3 FWI QTY = -999.99
更多添加到使用 FactorItem 列表和 Item 列表获取 Factor 可以使用
data class FactorWithFactorItemsWithItemsForFactor (
@Embedded
var factor: Factor = Factor(),
@Relation(
entity = FactorItem::class,
entityColumn = "factor_id",
parentColumn = "FactorId"
)
var factorItems: List<FactorItem> = emptyList(),
@Relation(
entity = Item::class,
entityColumn = "ItemId",
parentColumn = "FactorId",
associateBy =(Junction(value = FactorItem::class,parentColumn = "factor_id",entityColumn = "item_id"))
)
var items: List<Item> = emptyList()
)
喜欢道码
@Transaction
@Query("SELECT * FROM Factor")
fun getAllFactorsWithItemsWithFactorItem(): List<FactorWithFactorItemsWithItemsForFactor>
@Transaction
@Query("SELECT * FROM Factor WHERE FactorId = :factorId")
fun getFactorWithItemsWithFactorItemByFactorId(factorId: String): List<FactorWithFactorItemsWithItemsForFactor>
推荐阅读
- wxpython - 使用什么绑定来检测 FlatNotebook 标签页关闭 vis FNB_X_ON_TAB
- python - 将损失附加到 PyTorch 的计算图上
- php - 如果日历中的时间段接近 24 小时,则阻止它
- javascript - 使用 JQuery 获取 HTML 字段中的数据信息
- sql - 单列上的多个条件以将数据返回到多列
- c# - 如何从选定的选择器更新标签元素?(Xamarin 形式)
- python-3.x - Python 的 or 运算符如何处理 None 类型?
- php - 使用 PHP 读取字符串时缺少第一行
- python - 没有对应值时如何删除轴刻度线
- solidity - 具有 UTF-8 解码字符的 Solidity ERC20 合约