SQLite如何限制列值:安卓电商App购物车数量减为负数问题求解
购物车数量减操作避免负数的两种解决方案
方案1:SQL层面兜底限制(推荐优先使用)
直接在减数量的更新语句中通过SQLite内置的GREATEST函数限制最小值,从根源上避免数值变为负数。
修改后的subtractQuantity方法代码如下:
@Query("UPDATE cart_database SET quantity = GREATEST(quantity - 1, 1) where id = :id ") suspend fun subtractQuantity(id: Int): Int
这里GREATEST(quantity - 1, 1)的作用是取两个参数的最大值,也就是说如果商品数量减1后小于1,最终只会更新为1,不会出现0或者负数。如果你的业务允许商品数量减到0,把参数里的1改成0即可。
如果遇到部分设备SQLite版本较低不支持GREATEST的情况,也可以用CASE语句实现相同逻辑:
@Query("UPDATE cart_database SET quantity = CASE WHEN quantity - 1 < 1 THEN 1 ELSE quantity - 1 END where id = :id ") suspend fun subtractQuantity(id: Int): Int
方案2:业务逻辑层前置校验
适合需要配合UI做交互处理的场景,比如数量到下限时置灰减按钮、或者弹出删除提示:
- 先调用DAO的查询方法,获取对应id商品的当前数量
- 判断当前数量是否大于你设定的最小值(通常是1或者0)
- 仅当符合条件时才调用
subtractQuantity方法执行减操作,不符合条件时直接拦截,同时可以同步更新UI上减按钮的可点击状态
建议两种方案配合使用:SQL方案做兜底防止业务逻辑漏判,业务层校验做UI交互优化,双重保障不会出现负数问题。
内容的提问来源于stack exchange,提问作者Ahmadddd4
相关产品推荐
相关产品推荐

