Android cursor.moveToNext()抛出CursorWindowAllocationException

Android cursor.moveToNext()抛出CursorWindowAllocationException,android,sqlite,kotlin,android-sqlite,Android,Sqlite,Kotlin,Android Sqlite,由于这个异常,我已经有一些崩溃,但无法在我自己的任何设备/模拟器上复制它 来自google play控制台的stacktrace 正如我所说,google CursorWindowAllocationException几乎所有结果都与不关闭光标有关,并且内存不足导致moveToNext()引发异常 然而,在我得到的stacktrace中,没有关于内存不足的任何内容,我相信我的游标会被关闭,因为它所在的readableDatabase数据库是关闭的 发生错误的设备 基本上是一款带有2GB内存的现代

由于这个异常,我已经有一些崩溃,但无法在我自己的任何设备/模拟器上复制它

来自google play控制台的stacktrace 正如我所说,google CursorWindowAllocationException几乎所有结果都与不关闭光标有关,并且内存不足导致
moveToNext()
引发异常

然而,在我得到的stacktrace中,没有关于内存不足的任何内容,我相信我的游标会被关闭,因为它所在的readableDatabase数据库是关闭的

发生错误的设备 基本上是一款带有2GB内存的现代手机。过去60天里发生过一次,但几个月前我就看到了


该应用程序每天大约在40台设备上运行,因此在2400次运行中有1次崩溃-不多,但我想知道为什么会发生这种情况

尝试使用cursor.moveToFirst()


尝试使用游标。moveToFirst()


我想说你的工作是
cursor
有点奇怪。我不确定
光标是否会在数据库关闭时关闭。无论如何,我建议你:

if (cursor.moveToFirst()) {
    result = cursor.getString(cursor.getColumnIndex(gameTable.timestamp))
}
cursor.close()
db.close()

我想说你的工作是
cursor
有点奇怪。我不确定
光标是否会在数据库关闭时关闭。无论如何,我建议你:

if (cursor.moveToFirst()) {
    result = cursor.getString(cursor.getColumnIndex(gameTable.timestamp))
}
cursor.close()
db.close()

你能详细说明一下吗?由于我无法再现这次崩溃,因此很难测试这样的变化是否会产生积极影响。它应该如何防止此错误?该错误的可能重复?在我的堆栈跟踪中,哪里会出现超出已分配内存或已打开游标数的情况?我所能看到的只是一个未处理的异常;使用
try/catch
怎么样?另一个没有关闭光标的查询很可能。。。那么,在不知道问题是什么的情况下,您想如何定义问题是什么呢?在找到真正的原因之前,Try/catch可能是防止崩溃的一种不错的方法。还是不要认为链接中的答案在这里有任何帮助,或者回答我的任何问题:关闭readableDatabase不会关闭它的子游标吗?此外,这似乎与超出内存无关。那么,为什么在不知道问题是什么的情况下,你会认为这是同一个问题?你能详细说明一下吗?由于我无法再现这次崩溃,因此很难测试这样的变化是否会产生积极影响。它应该如何防止此错误?该错误的可能重复?在我的堆栈跟踪中,哪里会出现超出已分配内存或已打开游标数的情况?我所能看到的只是一个未处理的异常;使用
try/catch
怎么样?另一个没有关闭光标的查询很可能。。。那么,在不知道问题是什么的情况下,您想如何定义问题是什么呢?在找到真正的原因之前,Try/catch可能是防止崩溃的一种不错的方法。还是不要认为链接中的答案在这里有任何帮助,或者回答我的任何问题:关闭readableDatabase不会关闭它的子游标吗?此外,这似乎与超出内存无关。那么,为什么你在不知道问题是什么的情况下却认为是同一个问题呢?
fun getGameTime(gameId: Long): String{
        val db = this.readableDatabase
        val cursor = db.rawQuery("SELECT ${gameTable.timestamp} FROM ${gameTable.table} WHERE ${gameTable.id} = ${gameId}", null)
        var result = ""
        if(cursor.moveToFirst()){
            result = cursor.getString(cursor.getColumnIndex(gameTable.timestamp))
        }
        db.close()
        return result
    }
if (cursor.moveToFirst()) {
    result = cursor.getString(cursor.getColumnIndex(gameTable.timestamp))
}
cursor.close()
db.close()