![](/img/trans.png)
[英]Offline highscores with SharedPreferences - Android (java)
[英]SQLite highscores database, illegalStateException - Android (java)
我制作了一個有3列的SQLite高分; id(int - autoincrement),score(long)和percentage(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)
如果您發現一旦問題得到糾正,算法可能無法正常工作,我將不勝感激! 先謝謝你。
您對游標1的查詢不正確,請嘗試以下操作,
Cursor c1 = db.rawQuery( "SELECT " + PERCENTAGE + " FROM " + TABLE + " WHERE " + PERCENTAGE + "=" + percentage, null);
您還應該在使用游標之前對游標進行空檢查,並在完成后關閉游標:
if ( c1 != null && c2 != null )
{
// Do your thing
/* Stuff */
// Now close the cursors
c1.close();
c2.close();
}
更改
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子句傳遞百分比
您獲得異常的原因是您正在檢查c1是否包含元素(c1.getCount()> 0)然后使用可能為空的c2而不檢查c2.moveToFirst()是否返回false。
http://developer.android.com/reference/android/database/Cursor.html#moveToFirst ()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.