我有一个名为 OrderItem 的表。单击按钮时,值将保存到 OrderItem 表中。
@Entity(tableName = "order_item_table")
data class OrderItem(
@PrimaryKey(autoGenerate = true)
val order_item_id: Long = 0L,
@ColumnInfo(name = "order_id")
val orderId: Long,
@ColumnInfo(name = "item_id")
val itemId: Long,
@ColumnInfo(name = "quantity")
var quantity: Int
)
我正在通过视图模型插入值。
fun saveOrderItemsToDatabase(){
val itemMap = _menuItemList.value
Log.d("orderID", "itemMap: $itemMap")
var itemList = mutableListOf<OrderItem>()
if(itemMap == null){ return }
for((itemId,v) in itemMap){
val orderItem = OrderItem(0, orderId, itemId, v[0])
itemList.add(orderItem)
}
Log.d("orderID", "itemist: $itemList")
uiScope.launch {
insertItemsToDatabase(itemList)
}
}
private suspend fun insertItemsToDatabase(itemList: List<OrderItem>) {
withContext(Dispatchers.IO){
Log.d("orderID", "itemistDisp: $itemList")
appDB.orderDao.insertOrderItems(itemList)
}
}
问题是当我尝试在另一个视图模型中获取 OrderItem 表的值时。这些值已插入两次。我在将项目列表插入表格之前记录了项目列表,并且它不包含任何重复项目。
用于从另一个视图模型获取的代码:
private suspend fun createCheckoutItem(orderItems: List<OrderItem>): MutableList<CheckoutItem> {
val itemList = mutableListOf<CheckoutItem>()
Log.d("orderId", "orderItemsfromDB: $orderItems, size: ${orderItems.size}")
for (i in orderItems){
var item = CheckoutItem()
val currentItem = fetchItem(i.itemId)
item.orderId = i.orderId
item.itemCount = i.quantity
item.itemId = i.itemId
item.itemName = currentItem.itemName
item.itemPrice = currentItem.itemPrice
Log.d("orderId", "$item")
itemList.add(item)
}
return itemList
}
private suspend fun fetchOrderItems(orderId: Long) =
withContext(Dispatchers.IO){
appDB.orderDao.getAllOrderItems(orderId)
}
日志消息:
2021-05-25 20:49:09.926 2676-2676/com.example.foodie D/orderID: itemMap: {1=[3, 75]}
2021-05-25 20:49:09.927 2676-2676/com.example.foodie D/orderID: itemist: [OrderItem(order_item_id=0, orderId=27, itemId=1, quantity=3)]
2021-05-25 20:49:09.930 2676-2847/com.example.foodie D/orderID: itemistDisp: [OrderItem(order_item_id=0, orderId=27, itemId=1, quantity=3)]
2021-05-25 20:49:10.018 2676-2676/com.example.foodie D/orderId: orderItemsfromDB: [OrderItem(order_item_id=52, orderId=27, itemId=1, quantity=3), OrderItem(order_item_id=53, orderId=27, itemId=1, quantity=3)], size: 2
2021-05-25 20:49:10.022 2676-2676/com.example.foodie D/orderId: CheckoutItem(orderId=27, itemId=1, itemName=Carrot, itemPrice=75, itemCount=3)
2021-05-25 20:49:10.024 2676-2676/com.example.foodie D/orderId: CheckoutItem(orderId=27, itemId=1, itemName=Carrot, itemPrice=75, itemCount=3)
2021-05-25 20:49:10.024 2676-2676/com.example.foodie D/ITEMLIST: checkoutItemList: [CheckoutItem(orderId=27, itemId=1, itemName=Carrot, itemPrice=75, itemCount=3), CheckoutItem(orderId=27, itemId=1, itemName=Carrot, itemPrice=75, itemCount=3)]
OrderDao 代码:
@Dao
interface OrderDao {
@Insert
fun insertOrderItems(orderItems: List<OrderItem>)
}
答案 0 :(得分:0)
在您的 DAO 中,您可以注释一个 OnConflictStrategy,它定义了在插入数据时如何处理冲突。 更多信息在这里: https://developer.android.com/reference/androidx/room/OnConflictStrategy
例如,IGNORE 或 REPLACE 会起作用并防止两次插入数据:
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insertOrderItems(orderItems: List<OrderItem>)