Android SQLite: индекс -1 запрашивается с размером 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), если нет, я проверяю ответ, а затем делаю 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

Еще раз спасибо..

Из кода ошибки вашего получения вы можете отследить его до этого фрагмента кода:

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

Поэтому, по сути, я делаю проверку, если у меня есть только один столбец результатов, если я перехожу к первому столбцу, а затем получаю Integer в positon. Еще одна вещь, которую вы должны иметь в виду, – получить индекс столбца от имени столбца. Вы получите лучшую переносимость, если вы когда-нибудь решите изменить схему базы данных. На все ваши вопросы можно было ответить на документацию курсора, расположенную здесь: http://developer.android.com/reference/android/database/Cursor.html

Надеюсь, что ответит на все ваши вопросы.