如何实现Room数据库中批量删除Subroutines列表?
解决Room批量删除Subroutines的问题
问题根源
- 第一个报错是因为AsyncTask的
doInBackground方法接收的是可变参数List<Subroutines>... lists,这本质是一个数组,而你的DAO方法需要的是单个List<Subroutines>对象,直接传数组导致类型不匹配。 - 第二个编译错误是因为错误地把DAO参数改成了
List<Subroutines>[],Room无法识别List作为实体类,它只接受Subroutines这类实体对象的集合或数组。
正确解决方案
1. 恢复DAO的正确写法
Room的@Delete注解原生支持批量删除,参数可以是实体对象的Iterable(包括List)或数组,保持最初的DAO方法即可:
@Delete(entity = Subroutines.class) void deleteSubroutineList(List<Subroutines> subroutines);
2. 修正AsyncTask的传参逻辑
在doInBackground方法中,从可变参数数组中取出第一个List<Subroutines>元素,再传给DAO:
public void deleteSubroutineList(List<Subroutines> subroutines) { new DeleteSubroutineListAsyncTask(habitWithSubroutinesDao).execute(subroutines); } public static class DeleteSubroutineListAsyncTask extends AsyncTask<List<Subroutines>, Void, Void> { private final HabitWithSubroutinesDao habitWithSubroutinesDao; public DeleteSubroutineListAsyncTask(HabitWithSubroutinesDao habitWithSubroutinesDao) { this.habitWithSubroutinesDao = habitWithSubroutinesDao; } @Override protected Void doInBackground(List<Subroutines>... lists) { // 取出可变参数数组中的第一个List对象 if (lists != null && lists.length > 0) { habitWithSubroutinesDao.deleteSubroutineList(lists[0]); } return null; } }
可选替代方案:用实体数组实现批量删除
你也可以把DAO方法改成接收实体数组,写法更简洁:
@Delete(entity = Subroutines.class) void deleteSubroutines(Subroutines... subroutines);
对应的AsyncTask调用时,把List转成数组:
@Override protected Void doInBackground(List<Subroutines>... lists) { if (lists != null && lists.length > 0) { List<Subroutines> subroutineList = lists[0]; habitWithSubroutinesDao.deleteSubroutines(subroutineList.toArray(new Subroutines[0])); } return null; }
内容的提问来源于stack exchange,提问作者Gilbert Almazan
相关产品推荐
相关产品推荐

