场景:本地访问记录,记录用户每次的访问数据。该记录使用Sqlite存储,在数据新增的时候,并没有限制存储最近多少条,所以数据就会一直存下去,在用户删除最近访问记录时,使用Room框架执行删除操作时出现了android.database.sqlite.SQLiteException: too many SQL variables (code 1 SQLITE_ERROR) , 查询日志发现用户在删除最近记录数据多大3000条。
为什么会出现这个错误?或者说错误的原因是什么?
原因:在SQLite数据库的查询或插入操作中,当传递给SQL语句的变量数量超过SQLite的限制时。SQLite在单个SQL语句中允许的绑定变量数量有限制,这个限制是由SQLite的编译参数决定的,默认情况下通常不超过999个。
@Query("DELETE FROM browsing _history WHERE user_id = :userId AND id IN (:ids)")
suspend fun deleteBrowsingList(userId: String, ids: List<String>)
在id IN (:ids)参数有个数量限制不能超过999个
解决方法:
找到了问题所在,那么就分批次进行删除
/**
* 分批次删除
* */
private suspend fun deleteDataBatch(list: List<String>){
// 分批次处理 500个数据量为一个批次处理删除操作
val batchSize = 500
val batches = list.chunked(batchSize)
for (batch in batches) {
deleteById(batch)
}
}
如有不对之处,欢迎评论区指正~