2012-12-27 47 views
1

我做了一个SQLite高分,有3列; id(int - autoincrement),分数(long)和百分比(int)。我试图从列中提取所有数据,并将它们与用户刚刚看到的分数进行比较,看看他们的新分数是否成为排名前十的高分榜。SQLite高分数据库,illegalStateException - Android(java)

我想按百分比优先考虑高分首先,然后打分打破任何关系。下面是我开始这样做的地方。我甚至从来没有在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) 

如果你看到,一旦问题得到解决的算法可能会无法正常工作,我就明白,是指出了!先进的谢谢你。

回答

2

您的光标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(); 
} 
+0

一切工作,并感谢您的建议将光标空校验。我已经实现了。 – Matt

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子句