Android SQLite:请求索引-1,大小为1

时间:2013-04-15 18:08:59

标签: android database eclipse

我的应用程序需要一个数据库,但由于下面的错误,它会继续强制关闭。 它适用于我的一项活动,但不适用于其他活动

数据库处理程序:

public class DBGestion {

private static final int VERSION_BDD = 1;
private static final String NOM_BDD = "cityquest.db";

private static final String TABLE_QUEST = "table_quest";
private static final String COL_ID = "ID";
private static final int NUM_COL_ID = 0;
private static final String COL_USERNAME = "UserName";
private static final int NUM_COL_USERNAME = 1;
private static final String COL_NIVEAU ="Niveau";
private static final int NUM_COL_NIVEAU = 2;
private static final String COL_NBRIGOLETTES ="NbRigolettes";
private static final int NUM_COL_NBRIGOLETTES = 3;


private SQLiteDatabase bdd;

private MaBaseSQLite maBaseSQLite;  // MaBaseSQLite extends SQLiteOpenHelper

public DBGestion(Context context) {
    maBaseSQLite = new MaBaseSQLite(context, NOM_BDD, null, VERSION_BDD);
}

public void open() {
    bdd = maBaseSQLite.getWritableDatabase();
}

public void close() {
    bdd.close();
}

public SQLiteDatabase getBDD() {
        return bdd;
}

public long initDB(String userName){
    ContentValues values = new ContentValues();
    values.put(COL_USERNAME, userName);
    values.put(COL_NIVEAU,  0);
    values.put(COL_NBRIGOLETTES, 0);
    return bdd.insert(TABLE_QUEST,null, values);
}


public int getNiveau() {
    Cursor c = bdd.query(TABLE_QUEST, new String[] {COL_NIVEAU}, null, null, null, null, null);
    int niveau = c.getInt(NUM_COL_NIVEAU);
    return niveau;
}

public long setNiveau(int niveau) {
    ContentValues values = new ContentValues();
    values.put(COL_NIVEAU, niveau);
    return bdd.update(TABLE_QUEST,values, COL_ID + " = 0", null);
}

}

这是我使用get和set方法的代码(抱歉所有的法语变量名!)。基本上我首先检查问题是否已经回答(getNiveau()== 1),如果没有,我检查答案,然后制作一些Widget INVISIBLE,并设置setNiveau(1)(不可能关闭()dbGestion 2次,因为按钮被隐藏)

在我尝试使用数据库之前,我没有遇到任何问题。

public class Question extends Activity {

[variable declaration]

DBGestion dbGestion;


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.question_elisa);

        Intent i = getIntent();
        int format = i.getIntExtra(MainActivity.FORMAT,0);


        dbGestion = new DBGestion(this);

        [findViewById for all my variables]

if (format == 1){



        dbGestion.open();

        if (dbGestion.getNiveau() == 1) {
            bonneReponse.setVisibility(View.VISIBLE);
            [......]
            dbGestion.close();
        }  


bouton.setOnClickListener(new OnClickListener() { 

            @Override
            public void onClick(View v) {


            String reponse = new String("");
                reponse = editText.getText().toString();

            if(reponse.equalsIgnoreCase("poete") ||..){

                    bonneReponse.setVisibility(View.VISIBLE);
                                   [...]
                            }
                            else {...}


                                    dbGestion.setNiveau(1); 
                dbGestion.close();
}});

你知道问题出在哪里吗?

以下是我启动数据库的方法(在MainActivity onCreate方法中):

final DBGestion dbGestion = new DBGestion(this);

                dbGestion.open();
            dbGestion.initDB("Alex");
            dbGestion.close();

这是我的SQLiteOpenHelper类:

public class MaBaseSQLite extends SQLiteOpenHelper {

private static final String TABLE_QUEST ="table_quest";
private static final String COL_ID ="ID";
private static final String COL_NIVEAU ="Niveau";
private static final String COL_USERNAME ="UserName";
private static final String COL_NBRIGOLETTES ="NbRigolettes";

private static final String CREATE_DB = "CREATE TABLE " + TABLE_QUEST + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
+ COL_USERNAME + " TEXT NOT NULL, " + COL_NIVEAU + " TEXT NOT NULL, " + COL_NBRIGOLETTES + " TEXT NOT NULL); ";      

public MaBaseSQLite(Context context, String name, CursorFactory factory, int version) {
    super(context, name, factory, version);

}

@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL(CREATE_DB);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    db.execSQL("DROP TABLE" + TABLE_QUEST + ";");
    onCreate(db);


}

}

链接到Logcat:http://pastebin.com/ds9bKFcS

再次感谢..

1 个答案:

答案 0 :(得分:6)

从错误代码中,您可以将其追溯到这段代码:

public int getNiveau() {
    Cursor c = bdd.query(TABLE_QUEST, new String[] {COL_NIVEAU}, null, null, null, null, null);
    int niveau = c.getInt(NUM_COL_NIVEAU);
    return niveau;
}

首先,当您从数据库中获取Cursor时,检查光标并将其移动到相应的行是您的工作。例如,在您的情况下,如果知道您的团队只有一行,则可以执行此操作:

public int getNiveau() {
    Cursor c = bdd.query(TABLE_QUEST,new String[] { COL_NIVEAU},null,null,null,null,null);
    if(c.getCount() == 1) {
        c.moveToFirst();
        int niveau = c.getInt(c.getColumnIndexOrThrow(MaBaseSQLite.COL_NIVEAU));
        c.close();
        return niveau;
    }
    c.close();
    return -1;
}

基本上我正在做的是检查我是否只有一个结果列,如果我移动到第一列然后在位置获得整数。您必须记住的另一件事是从列名称中获取Column索引。如果您决定更改数据库架构,则可以获得更好的可移植性。您可以通过此处的Cursor文档回答您的所有问题:http://developer.android.com/reference/android/database/Cursor.html

希望能回答你的所有问题。