房间数据库创建重复插入

时间:2021-05-25 15:23:37

标签: android kotlin android-room

我有一个名为 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>)

}

1 个答案:

答案 0 :(得分:0)

在您的 DAO 中,您可以注释一个 OnConflictStrategy,它定义了在插入数据时如何处理冲突。 更多信息在这里: https://developer.android.com/reference/androidx/room/OnConflictStrategy

例如,IGNORE 或 REPLACE 会起作用并防止两次插入数据:

@Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insertOrderItems(orderItems: List<OrderItem>)
相关问题