Android 解析:SQLiteException:固定时

问题描述 投票:0回答:1

我有一个 AsyncTask,它对 Parse 执行一系列查询,然后将结果固定到本地数据存储。

问题是,执行几次查询后,最终对 ParseObject.pinAll(listOfParseObjects) 的所有后续调用都会失败:

SQLiteException:太多 SQL 变量(代码 1):,编译时: DELETE FROM ParseObjects WHERE uuid IN (?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,...等等

我尝试将查询限制从 1000 逐步降低到 100,但无论如何都会发生。

请帮忙。谢谢!

android sqlite parse-platform
1个回答
0
投票

每当您使用“IN”时,请注意最多可提及 999 个项目。否则你会得到

 SQLiteException: too many SQL variables" when using " IN (...)"
:

https://issuetracker.google.com/issues/192284727#comment2

基于集合的大小,Android的SQLite有限制 999 个绑定查询参数,因此是一个包含超过 999 个的集合 项目失败。

我已要求在这里更好地解决它(请考虑加星标):

https://issuetracker.google.com/issues/192384616

因此,您需要将其拆分为多个请求(如果可能的话可以在一个事务中)。

对于数据库上的所有操作都是如此,即插入、删除和选择。您使用哪个 API 并不重要。

如何在 Room 中使用它进行删除的示例:

@WorkerThread
@Query("DELETE FROM some_table WHERE phone_number IN (:phoneNumbersToRemove)")
protected abstract fun removePhoneNumbersDbImp(phoneNumbersToRemove: Collection<String>): Int

@WorkerThread
@Transaction
open fun removePhoneNumbersDb(phoneNumbersToRemove: Set<String>) {
    if (phoneNumbersToRemove.isEmpty())
        return
    phoneNumbersToRemove.asSequence().chunked(999).forEach {
        removePhoneNumbersDbImp(it)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.