4

アプリケーション用のデータベースが必要ですが、以下のエラーが原因で強制的に閉じられます。私のアクティビティの1つで機能しますが、他のアクティビティでは機能しません

データベース ハンドラ:

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)、そうでない場合は、回答を確認してからウィジェットを非表示にし、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

再度、感謝します..

4

1 に答える 1

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 を取得したら、カーソルをチェックして適切な行に移動するのがあなたの仕事です。たとえば、あなたの場合、チームに1行しかないことがわかっている場合、これを行うことができます:

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;
}

したがって、本質的に私がしていることは、最初の列に移動してからその位置で整数を取得する場合、結果列が 1 つしかないかどうかを確認することです。留意しなければならないもう 1 つのことは、列の名前から列インデックスを取得することです。データベーススキーマを変更することにした場合でも、これを行うと移植性が向上します。あなたの質問はすべて、ここにあるカーソルのドキュメントで答えることができます: http://developer.android.com/reference/android/database/Cursor.html

それがあなたのすべての質問に答えることを願っています。

于 2013-04-15T18:22:02.747 に答える