cursor.moveToNext () создает исключение CursorWindowAllocationException - PullRequest
0 голосов
/ 25 февраля 2019

Я получил несколько сбоев из-за этого исключения, но не могу воспроизвести его ни на одном из моих собственных устройств / эмуляторов.

Трассировка стека из консоли Google Play

  android.database.CursorWindowAllocationException: 
  at android.database.CursorWindow.<init> (CursorWindow.java:108)
  at android.database.AbstractWindowedCursor.clearOrCreateWindow (AbstractWindowedCursor.java:198)
  at android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:138)
  at android.database.sqlite.SQLiteCursor.getCount (SQLiteCursor.java:132)
  at android.database.AbstractCursor.moveToPosition (AbstractCursor.java:220)
  at android.database.AbstractCursor.moveToNext (AbstractCursor.java:269)
  at rpuls.yatzysheets.DBController.getGameTime (DBController.kt:264)
  at rpuls.yatzysheets.PreviousGames$onCreateView$1.invoke (PreviousGames.kt:78)
  at rpuls.yatzysheets.PreviousGames$onCreateView$1.invoke (PreviousGames.kt:23)
  at org.jetbrains.anko.support.v4.SupportKt.UI (Support.kt:62)
  at rpuls.yatzysheets.PreviousGames.onCreateView (PreviousGames.kt:33)
  at android.support.v4.app.Fragment.performCreateView (Fragment.java:2337)
  at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1419)
  at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1740)
  at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1809)
  at android.support.v4.app.BackStackRecord.executeOps (BackStackRecord.java:799)
  at android.support.v4.app.FragmentManagerImpl.executeOps (FragmentManager.java:2580)
  at android.support.v4.app.FragmentManagerImpl.executeOpsTogether (FragmentManager.java:2367)
  at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManager.java:2322)
  at android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:2229)
  at android.support.v4.app.FragmentManagerImpl$1.run (FragmentManager.java:700)
  at android.os.Handler.handleCallback (Handler.java:790)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6651)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:810)

Функция, которая ее выбрасывает

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.moveToNext()){
        result = cursor.getString(cursor.getColumnIndex(gameTable.timestamp))
    }
    db.close()
    return result
}

Как я Google CursorWindowAllocationException почти каждый результатчто-то связанное с не закрытием курсора и нехваткой памяти, в результате чего moveToNext() выдает исключение.

Как бы то ни было, в полученной мной трассировке стека нет ничего о нехватке памяти, и я считаю, что мой курсор будет закрыт, так как база данных readableDatabase, в которой он жил, закрыта?

Устройствагде произошла ошибка

В основном современный телефон с оперативной памятью 2 ГБ.Это случилось однажды за последние 60 дней, но я видел это несколько месяцев назад.

Приложение работает примерно на 40 устройствах каждый день, так что на 2400 запусков приходится 1 сбой - не так много, но мне хотелось бы знать, почему это происходит.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Я бы сказал, что ваша работа cursor немного странная.И я не уверен, что cursor будет закрыто при закрытии базы данных.Я бы предложил сделать в любом случае:

if (cursor.moveToFirst()) {
    result = cursor.getString(cursor.getColumnIndex(gameTable.timestamp))
}
cursor.close()
db.close()
0 голосов
/ 25 февраля 2019

Попробуйте с помощью cursor.moveToFirst ().

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
    }
...