Android Room数据库如何筛选isSelected为true的任务列表实现批量删除
实现方案
1. 新增Room Dao层查询/操作方法
首先在你的TaskDao接口中新增筛选选中任务、批量删除的方法,Room会自动将布尔类型的isSelected映射为整型1(true)/0(false)存储,直接按值查询即可:
@Dao interface TaskDao { // 已有方法:查询所有任务 @Query("SELECT * FROM Task") suspend fun getAllTasks(): List<Task> // 新增:筛选所有isSelected为true的任务 @Query("SELECT * FROM Task WHERE isSelected = 1") suspend fun getSelectedTasks(): List<Task> // 新增:批量删除任务,比循环单条删除效率更高 @Delete suspend fun deleteBatchTasks(tasks: List<Task>) // 你原有其他方法(updateTask、deleteTask等)保留即可 }
2. ViewModel层逻辑调整
直接以数据库存储的isSelected字段为唯一数据源,不需要手动维护选中任务集合,自动触发选择模式切换:
class ListTaskViewModel(private val context: Application) : AndroidViewModel(context) { val taskList = MutableLiveData<List<Task>>() val selectionMode = MutableLiveData<Boolean>(false) // 新增:自动筛选的选中任务列表 val selectedTasksList = MutableLiveData<List<Task>>() init { // 监听全量任务列表变化,自动筛选选中项、更新选择模式状态 viewModelScope.launch { taskList.asFlow().collect { allTasks -> val selectedList = allTasks.filter { it.isSelected } selectedTasksList.postValue(selectedList) selectionMode.postValue(selectedList.isNotEmpty()) } } // 初始化时加载全量任务 refreshScreen() } fun syncSelection(task: Task) { viewModelScope.launch { // 直接翻转任务的选中状态更新到数据库,不需要手动维护集合 val updatedTask = task.copy(isSelected = !task.isSelected) DataBaseConnect.getTaskDao(context).updateTask(updatedTask) refreshScreen() } } fun deleteSelectedTasks(context: Context){ viewModelScope.launch { selectedTasksList.value?.takeIf { it.isNotEmpty() }?.let { list -> DataBaseConnect.getTaskDao(context).deleteBatchTasks(list) // 删除完成自动关闭选择模式 selectionMode.postValue(false) refreshScreen() } } } fun refreshScreen() { viewModelScope.launch { // 从数据库查询最新全量任务,自动触发选中列表筛选 val allTasks = DataBaseConnect.getTaskDao(context).getAllTasks() taskList.postValue(allTasks) } } // 原有其他方法保留即可 }
3. Activity层补充缺失逻辑
你原有观察逻辑已经适配,只需要补充删除确认弹窗的实现即可:
private fun setupConfirmationDialog() { AlertDialog.Builder(this) .setTitle("确认删除") .setMessage("确定要删除选中的所有任务吗?该操作无法撤销。") .setPositiveButton("删除") { _, _ -> viewModel.deleteSelectedTasks(this) } .setNegativeButton("取消", null) .show() }
4. 适配器补充选中状态展示
在ListTaskAdapter的onBindViewHolder方法中,根据isSelected字段切换Item的展示样式,比如勾选框显隐、背景色变化:
override fun onBindViewHolder(holder: TaskViewHolder, position: Int) { val task = currentList[position] // 切换选中样式 holder.itemView.isSelected = task.isSelected holder.selectCheckbox.isVisible = task.isSelected // 点击触发选中状态同步 holder.itemView.setOnClickListener { selectionTaskCallback.invoke(task) } }
内容的提问来源于stack exchange,提问作者Lucas Moro
相关产品推荐
相关产品推荐

