java
infoDAO.deleteByInfoIds(ids);
-
在 Android 开发中,使用 Room 时,执行上述代码时,出现如下错误信息
Caused by: android.database.sqlite.SQLiteException: too many SQL variables (code 1 SQLITE_ERROR): , while compiling: DELETE FROM Info WHERE infoId IN (?,?,?,?,?...
问题原因
-
SQLite 数据库参数数量超限导致的崩溃问题
-
SQLite 数据库在编译 SQL 语句时,对绑定参数(
?占位符)的数量有硬性上限,默认是 999 个SQLITE_MAX_VARIABLE_NUMBER
- 参考文档:
https://sqlite.org/limits.html
处理策略
- 分批删除,将大的 ID 列表拆分成多个小批次,例如,每批 500 个,循环执行删除,直到全部删完
java
int batchSize = 500;
int totalSize = ids.size();
for (int i = 0; i < totalSize; i += batchSize) {
int end = Math.min(i + batchSize, totalSize);
List<Integer> batchIds = ids.subList(i, end);
infoDAO.deleteByInfoIds(batchIds);
}