当id> 999时崩溃
android.database.sqlite.SQLiteException: too many SQL variables (code 1): ,
while compiling: delete from data where ids in (?,?,...)
看到this的最大限制为999。
如何使用“会议室”删除1000多个?
答案 0 :(得分:1)
可能您有要删除的ID列表。打开一个事务,在子列表中拆分列表,然后对子列表执行一次SQL删除操作。
有关Room的更多信息,请访问Transactions with Room的官方文档。
我没有测试以下代码,但我认为它可以满足您的需求。
@Dao
public interface DataDao {
@Delete("delete from data where ids in :filterValues")
long delete(List<String> filterValues)
@Transaction
public void deleteData(List<Data> dataToDelete) {
// split the array in list of 100 elements (change as you prefer but < 999)
List<List<Data>> subLists=DeleteHelper.chopped(dataToDelete, 100);
List<String> ids=new ArrayList<>();
for (List<Data> list: subList) {
list.clear();
for (Data item: list) {
ids.add(item.getId());
}
delete(ids);
}
}
}
public abstract class DeleteHelper {
// chops a list into non-view sublists of length L
public static <T> List<List<T>> chopped(List<T> list, final int L) {
List<List<T>> parts = new ArrayList<List<T>>();
final int N = list.size();
for (int i = 0; i < N; i += L) {
parts.add(new ArrayList<T>(
list.subList(i, Math.min(N, i + L)))
);
}
return parts;
}
}
我希望有帮助。
答案 1 :(得分:0)
我认为有两种解决方法。
首先,将您的列表切碎,并使用delete方法运行多次。 (就像@xcesco回答的一样)
第二,您可以编写很长的查询并使用@RawQuery运行它。
if self.__cache is None