bugfix> sqlite > 投稿

私はAndroid Studioで働いていますlibgdx そしてgdx-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();
    }

Desktop-Versionは問題なく動作しますが、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)));
    }

すべてのデータが正しく出力されています。 誰が問題が何かを知っていますか? ご協力ありがとうございました

回答 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);
                }
            }
    
    

    問題は、アンドロイドではカーソルが-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にあります。

    このソリューションが誰かを助けることを願っています。

あなたの答え