Search code examples
javaandroiddatabasesqlitecursor

Confusing cursor index out of bounds exception


I have a database that contains level and stage of the game and the problem is every time I call method getId(), getLevel() or getStage() in my code, it's just throws CursorIndexOutOfBoundsException. I have 5 indices of my database but it tells me that only 0 indices are available. This is the code:

Database helper class:

public class DatabaseGame extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "DB2.db";
private static final int SCHEMA_VERSION = 6;

public DatabaseGame(Context context) {
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE save_progress (ID INTEGER PRIMARY KEY NOT NULL, LEVEL VARCHAR(3), STAGE1 VARCHAR(3), STAGE2 VARCHAR(3), STAGE3 VARCHAR(3));");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

public void insert(String level, String stage1, String stage2, String stage3) {
    ContentValues carry = new ContentValues();

    carry.put("ID", 1);
    carry.put("LEVEL", level);
    carry.put("STAGE1", stage1);
    carry.put("STAGE2", stage2);
    carry.put("STAGE3", stage3);

    getWritableDatabase().insert("save_progress", null, carry);
}

public void update(int id, String level, String stage1, String stage2,
        String stage3) {
    getWritableDatabase().execSQL(
            "UPDATE save_progress SET LEVEL = '" + level + "', STAGE1 = '"
                    + stage1 + "', STAGE2 = '" + stage2 + "', STAGE3 = '"
                    + stage3 + "'  WHERE ID = " + id + ";");
}

public Cursor getAll() {
    return (getReadableDatabase().rawQuery("SELECT * FROM save_progress",
            null));
}

public String getId(Cursor c) {
    return (c.getString(0));
}

public String getLevel(Cursor c) {
    return (c.getString(1));
}

public String getStage(Cursor c, int level) {
    return (c.getString(level + 1));
}
}

Main class. The error occures when I access Integer.parseInt(db.getLevel(select)):

public class Level extends Activity {

DatabaseGame db = null;
Handler handlerTimer = new Handler();
ImageButton lv1, lv2, lv3;
Animation b1, b2, b3;
Cursor select = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.level);
    b1 = AnimationUtils.loadAnimation(this, R.anim.button);
    b2 = AnimationUtils.loadAnimation(this, R.anim.button);
    b3 = AnimationUtils.loadAnimation(this, R.anim.button);

    db = new DatabaseGame(this);
    select = db.getAll();
    if(select == null) {
        db.insert("1", "1", "1", "1");
    }
    initAnimation();
    super.onCreate(savedInstanceState);
}

@Override
protected void onPause() {
    super.onPause();
    db.close();
    finish();
}

public void initAnimation() {
    Thread animated = new Thread() {
        public void run() {
            try {
                lv1 = (ImageButton) findViewById(R.id.level1);
                lv1.setImageResource(R.drawable.level1_b);
                lv1.setAnimation(b1);
                lv1.startAnimation(b1);
                lv1.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Bundle trans = new Bundle();
                        trans.putInt("level", 1);
                        Intent change = new Intent("com.idncd.indonesiaku.STAGE");
                        change.putExtras(trans);
                        startActivity(change);
                    }
                });

                handlerTimer.postDelayed(new Runnable() {
                    public void run() {
                        if (Integer.parseInt(db.getLevel(select)) > 1) {
                            lv2 = (ImageButton) findViewById(R.id.level2);
                            lv2.setImageResource(R.drawable.level2_b);
                            lv2.setAnimation(b2);
                            lv2.startAnimation(b2);
                            lv2.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {
                                    Bundle trans = new Bundle();
                                    trans.putInt("level", 1);
                                    Intent change = new Intent("com.idncd.indonesiaku.STAGE");
                                    change.putExtras(trans);
                                    startActivity(change);
                                }
                            });
                        } else {
                            lv2 = (ImageButton) findViewById(R.id.level2);
                            lv2.setImageResource(R.drawable.level2_un_b);
                            lv2.setAnimation(b2);
                            lv2.startAnimation(b2);
                            lv2.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {

                                }
                            });
                        }
                    }
                }, 300);

                handlerTimer.postDelayed(new Runnable() {
                    public void run() {
                        if (Integer.parseInt(db.getLevel(select)) > 2) {
                            lv3 = (ImageButton) findViewById(R.id.level3);
                            lv3.setImageResource(R.drawable.level3_b);
                            lv3.setAnimation(b3);
                            lv3.startAnimation(b3);
                            lv3.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {
                                    Bundle trans = new Bundle();
                                    trans.putInt("level", 1);
                                    Intent change = new Intent("com.idncd.indonesiaku.STAGE");
                                    change.putExtras(trans);
                                    startActivity(change);
                                }
                            });
                        } else {
                            lv3 = (ImageButton) findViewById(R.id.level3);
                            lv3.setImageResource(R.drawable.level3_un_b);
                            lv3.setAnimation(b3);
                            lv3.startAnimation(b3);
                            lv3.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {

                                }
                            });
                        }
                    }
                }, 600);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    animated.start();
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent menu = new Intent("com.idncd.indonesiaku.MAINMENU");
        startActivity(menu);
        return true;
    } else {
        return super.onKeyUp(keyCode, event);
    }
}
}

Thank you for your help.


Solution

  • You have to firstly set location of Cursor refrence before use it , Use moveToFirsrt(), moveToLast() etc..