Android之Room数据库大数据量删除操作出现的SQLiteException: too many SQL variables

272 阅读1分钟

场景:本地访问记录,记录用户每次的访问数据。该记录使用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)
        }
    }

如有不对之处,欢迎评论区指正~