Android中如何编写Room查询实现指定字段的互斥更新?
解决方案
在Room中,你可以通过两种方式实现这个需求:
方式一:单条UPDATE语句(高效)
通过CASE WHEN语法在一次数据库操作中完成旧记录重置和新记录设置,避免多次数据库交互:
@Query(""" UPDATE InStoreShoppingListItemEntity SET shopping_list_undo_item = CASE WHEN id = :targetId THEN 1 ELSE 0 END WHERE shopping_list_undo_item = 1 OR id = :targetId """) suspend fun updateUndoItem(targetId: Long) -- 这里的类型要和你Entity中id的类型匹配,比如Int或Long
逻辑说明:
WHERE子句限定只更新两类记录:原本shopping_list_undo_item为1的旧记录,以及目标id的记录CASE WHEN将目标id的字段设为1,其余符合条件的记录(旧的那条)设为0
方式二:事务包裹双更新(直观易维护)
如果更倾向于清晰的分步逻辑,可以用Room的事务注解包裹两个独立的更新操作,保证原子性(要么都执行成功,要么都不执行):
@Dao interface InStoreShoppingListItemDao { // 重置所有当前为1的记录为0 @Query("UPDATE InStoreShoppingListItemEntity SET shopping_list_undo_item = 0 WHERE shopping_list_undo_item = 1") suspend fun resetAllUndoItems() // 设置目标id的字段为1 @Query("UPDATE InStoreShoppingListItemEntity SET shopping_list_undo_item = 1 WHERE id = :targetId") suspend fun setTargetUndoItem(targetId: Long) // 事务包裹两个操作 @Transaction suspend fun updateUndoItem(targetId: Long) { resetAllUndoItems() setTargetUndoItem(targetId) } }
注意事项:
- 确保你的Entity中
shopping_list_undo_item字段的类型是Int或Boolean(如果是Boolean,Room会自动映射为0/1) - 调用时直接调用
updateUndoItem(targetId)即可完成整个操作
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

