Java 混淆游标索引越界异常
我有一个包含游戏级别和阶段的数据库,问题是每次我在代码中调用方法Java 混淆游标索引越界异常,java,android,database,sqlite,cursor,Java,Android,Database,Sqlite,Cursor,我有一个包含游戏级别和阶段的数据库,问题是每次我在代码中调用方法getId(),getLevel()或getStage(),它只是抛出CursorIndexOutOfBoundsException。我的数据库有5个索引,但它告诉我只有0个索引可用。代码如下: 数据库帮助器类: public class DatabaseGame extends SQLiteOpenHelper { private static final String DATABASE_NAME = "DB2.db"; pri
getId()
,getLevel()
或getStage()
,它只是抛出CursorIndexOutOfBoundsException
。我的数据库有5个索引,但它告诉我只有0个索引可用。代码如下:
数据库帮助器类:
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));
}
}
主类。访问Integer.parseInt(db.getLevel(select))
时出错:
感谢您的帮助。您必须先设置
光标的位置,然后再使用它,使用moveToFirsrt()、moveToLast()
等 这个问题有点不清楚,但我想您的意思是SELECT*
不会返回onCreate()中的所有列
您已更新了SCHEMA\u版本
,但您的onUpgrade()
为空。因此,数据库实际上没有被更新,尽管框架认为是这样的,因为onUpgrade()
成功返回
清理应用程序数据或卸载它以删除旧的数据库文件。然后,当应用程序再次运行时,您的数据库助手onCreate()
会正确地重新创建它
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);
}
}
}