1

3列のSQLiteハイスコアを作成しました。id(int - 自動インクリメント)、スコア(long)、パーセンテージ(int)。列からすべてのデータを取得し、それらをユーザーが得たスコアと比較して、新しいスコアがトップ 10 を保持するハイスコア リストを作成したかどうかを確認しようとしています。

最初にパーセンテージでハイスコアを優先し、次にスコアを付けて引き分けにしたいと考えています。以下は、私がこれを始めているところです。Java以外でもSQLiteを使用したことがないので、これは私にとってまったく新しいことです。エラーが発生しています。LogCatは以下です。

よろしくお願いいたします。

//Check if new record makes the top 10.
public boolean check(long score, int percentage) {
    Cursor c1 = db.rawQuery("SELECT " + PERCENTAGE + " FROM " + TABLE + " WHERE " + PERCENTAGE + "= percentage;", null);
    Cursor c2 = db.rawQuery("SELECT " + SCORE + " FROM " + TABLE + ";", null);
    if(c1.getCount() > 0) {               
        c2.moveToFirst();
        int i = 0;
        do {
            i++;
            long x = c2.getLong(c2.getColumnIndex("SCORE"));  //Line 39
            if(x < percentage) {
                if(c2.getCount() == 9) {
                    //Delete last record in high score and insert at index.
                    db.rawQuery("DELETE FROM " + TABLE + " WHERE " + ID + " = 10;", null);
                    db.rawQuery("INSERT INTO " + TABLE + "VALUES (" + i + ", " + score + ", " + percentage + ");", null);
                    return true;
                } else {
                    //No deletion - just insert.
                    db.rawQuery("INSERT INTO " + TABLE + "VALUES (" + i + ", " + score + ", " + percentage + ");", null);
                    return true;
                }
            } else {
                return false;
            }
        } while (c2.moveToNext());
    } else {
        return false;
    }
}

LogCat 出力

12-19 02:26:45.270: E/AndroidRuntime(24809): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.Results}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.os.Looper.loop(Looper.java:137)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.app.ActivityThread.main(ActivityThread.java:4745)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at java.lang.reflect.Method.invokeNative(Native Method)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at java.lang.reflect.Method.invoke(Method.java:511)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at dalvik.system.NativeStart.main(Native Method)
12-19 02:26:45.270: E/AndroidRuntime(24809): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.database.CursorWindow.nativeGetLong(Native Method)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.database.CursorWindow.getLong(CursorWindow.java:507)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at com.example.test.DatabaseHelper.check(DatabaseHelper.java:39)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at com.example.test.Results.showResults(Results.java:102)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at com.example.test.Results.onCreate(Results.java:51)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.app.Activity.performCreate(Activity.java:5008)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
12-19 02:26:45.270: E/AndroidRuntime(24809):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

問題が修正されるとアルゴリズムがおそらく機能しないことがわかった場合は、それも指摘していただければ幸いです。よろしくお願いします。

4

3 に答える 3

2

カーソル1のクエリが正しくありません。次のことを試してください、

Cursor c1 = db.rawQuery( "SELECT " + PERCENTAGE + " FROM " + TABLE + " WHERE " + PERCENTAGE + "=" + percentage, null);

また、カーソルを使用する前にnullチェックを実行し、終了したらカーソルを閉じる必要があります。

if ( c1 != null && c2 != null )
{
    // Do your thing
    /* Stuff */

    // Now close the cursors
    c1.close();
    c2.close();
}
于 2012-12-27T19:43:25.373 に答える
1

変化する

Cursor c1 = db.rawQuery("SELECT " + PERCENTAGE + " FROM " + TABLE +
                                 " WHERE " + PERCENTAGE + "= percentage;", null);

Cursor c1 = db.rawQuery("SELECT " + PERCENTAGE + " FROM " + TABLE + 
                                " WHERE " + PERCENTAGE + "="+ percentage, null);

現在、WHERE句でパーセンテージを渡していない

于 2012-12-27T19:43:30.600 に答える
0

例外が発生する理由は、c1に要素が含まれているかどうかを確認し(c1.getCount()> 0)、空の可能性があるc2を使用しており、c2.moveToFirst()がfalseを返さないかどうかを確認していないためです。

http://developer.android.com/reference/android/database/Cursor.html#moveToFirst()

于 2012-12-27T19:44:11.427 に答える