GDX-SQLite android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为1

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

我在 Android Studio 中使用 libgdxgdx-sqlite。我想使用以下代码从我的数据库进行简单的查询。

try {
    cursorSettings = dbHandler.rawQuery("SELECT "+COLUMN_SETTING+" FROM "+TABLE_SETTINGS+" WHERE "+COLUMN_SETTINGSID+" =13");
    System.out.println(cursorSettings.getLong(0));
} catch (SQLiteGdxException e) {
    e.printStackTrace();
}

桌面版本工作正常,但在 Android 版本中我收到以下错误:

05-25 10:21:47.341 11978-12232/ch.shuttering.rapporte E/AndroidRuntime: FATAL EXCEPTION: GLThread 82275
Process: ch.shuttering.rapporte, PID: 11978
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
    at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
    at com.badlogic.gdx.sqlite.android.AndroidCursor.getLong(AndroidCursor.java:61)
    at ch.shuttering.rapporte.Manager.SQLiteManager.SaveMangerSQLite.creatSQLiteSettings(SaveMangerSQLite.java:295)
    at ch.shuttering.rapporte.RapporteMain.create(RapporteMain.java:66)
    at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:311)
    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1546)
    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1262)

所以每次我从游标执行 getXXX() 查询时,都会收到错误,但如果我现在使用以下代码:

try {
    cursorSettings = dbHandler.rawQuery("SELECT * FROM "+TABLE_SETTINGS);
} catch (SQLiteGdxException e) {
    e.printStackTrace();
}
while (cursorSettings.next()) {
    Gdx.app.log("FromDb", String.valueOf(cursorSettings.getString(1)));
}

我的所有数据都有正确的输出。 有谁知道问题是什么? 感谢您的帮助。

sqlite android-studio libgdx cursor
1个回答
1
投票

好吧,我自己发现了问题,是Android类中的代码

@Override
public long getLong (int columnIndex) {
    try { 
        return cursor.getLong(columnIndex);
    } catch (SQLiteException e) {
        Gdx.app.log(DatabaseFactory.ERROR_TAG, "There was an error in getting the long", e);
        throw new SQLiteGdxRuntimeException(e);
    }
}

问题是在Android中光标指向-1,所以需要先将其设置到正确的位置,下面的代码解决了这个问题。

@Override
public long getLong (int columnIndex) {
    try {
        cursor.moveToFirst();
        return cursor.getLong(columnIndex);
    } catch (SQLiteException e) {
        Gdx.app.log(DatabaseFactory.ERROR_TAG, "There was an error in getting the long", e);
        throw new SQLiteGdxRuntimeException(e);
    }
}

您可以在 AndroidCursor 类的 gdx-sqlite-android.jar 库中找到此代码。

我希望这个解决方案可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.