报错信息:
bash
android.database.sqlite.SQLiteException:
too many SQL variables (code 1 SQLITE_ERROR):
while compiling: SELECT * FROM points WHERE id IN (?,?,?,...,?,?,?)
SQLiteException: too many SQL variables 通常是由于一次查询或插入的 SQL 语句中包含的绑定变量超过了 SQLite 的限制。SQLite 默认的最大绑定变量数量是 999。如果您使用的 SQL 包含的绑定参数(如 IN 查询中的参数个数)超过了这个限制,就会导致此错误。
SQLITE_MAX_VARIABLE_NUMBER 是 SQLite 中定义的绑定变量的最大数量限制,它的值可能因版本和具体的编译配置而有所不同。以下是不同版本的默认值和相关说明:
- SQLite 3.32.0 及以上版本:
默认值为 32766。
这是当前支持的最大值,前提是 SQLite 编译时未限制更小的值。 - SQLite 3.22.0 到 3.31.1:
默认值为 999。 - SQLite 3.6.19 到 3.21.0:
默认值为 999。 - SQLite 3.6.18 及更早版本:
默认值为 250, 500 或 999,具体取决于编译时配置。
解决方法:分批查询
kotlin
fun queryInBatches(dao: YourDao, ids: List<Long>): List<YourEntity> {
val batchSize = 900 // 每批最大数量
val result = mutableListOf<YourEntity>()
// 将 ids 按照 batchSize 分成若干小批次。
ids.chunked(batchSize) { chunk ->
result.addAll(dao.queryByIds(chunk))
}
return result
}