Как я могу исправить CursorIndexOutOfBoundsException с использованием SQLite и получить данные - PullRequest
0 голосов
/ 29 апреля 2018

Я знаю, что этот вопрос, возможно, задавали много раз. Я впервые использую SQLite в Android. Моя проблема в том, что я хочу сохранить объект при нажатии на кнопку. Я искал на github и читал статьи о SQLite. До сих пор я могу сохранить это object, но не могу получить его, потому что я получаю CursorIndexOutOfBoundsException при использовании функции getSkip. кроме того, я не знаю, правильный ли мой код или нет.

Вот мой класс

public class SkippedQuestions {
public static final String TABLE_NAME = "skiptable";
public static final String ID = "id";
public static final String QUESTION = "question";
public static final String ANSONE = "answerone";
public static final String ANSTWO = "answertwo";
public static final String ANSTHREE = "answerthree";
public static final String ANSFOUR = "answerfour";

private int id;
private String question,ans1,ans2,ans3,ans4;

public static final String CREATE_TABLE =
        "CREATE TABLE "+TABLE_NAME+"("+
                ID +" INTEGER PRIMARY KEY AUTOINCREMENT,"
        +QUESTION+" TEXT,"
        + ANSONE +" TEXT,"
        + ANSTWO +" TEXT,"
        + ANSTHREE +" TEXT,"
        + ANSFOUR +" TEXT)";

public static final String SQL_DELETE_ENTRIES =
        "DROP TABLE IF EXISTS " + TABLE_NAME;

public SkippedQuestions() {
}


public SkippedQuestions(int id,String question,String ans1,String ans2,String ans3,String ans4) {
    this.id=id;
    this.question = question;
    this.ans1=ans1;
    this.ans2=ans2;
    this.ans3=ans3;
    this.ans4=ans4;
}

//Then my setter and getter

Мой Database класс

public class DatabaseHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "skip_db";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
        db.execSQL(SkippedQuestions.CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(SkippedQuestions.SQL_DELETE_ENTRIES);
    onCreate(db);
}

public boolean insertSkip(String quest,String ans1,String ans2,String ans3,String ans4) {
    // get writable database as we want to write data
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(SkippedQuestions.QUESTION,quest);
    values.put(SkippedQuestions.ANSONE,ans1);
    values.put(SkippedQuestions.ANSTWO,ans2);
    values.put(SkippedQuestions.ANSTHREE,ans3);
    values.put(SkippedQuestions.ANSFOUR,ans4);
    //insert row
     db.insert(SkippedQuestions.TABLE_NAME,null,values);
    return true;
}



public Cursor getSkip(int id) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery("SELECT * FROM " + SkippedQuestions.TABLE_NAME + " WHERE " +
            SkippedQuestions.ID + "=?", new String[]{Integer.toString(id)});
    return res;
}


public ArrayList<SkippedQuestions> getAllSkipped() {
    ArrayList<SkippedQuestions> skippes = new ArrayList<>();

    // Select All Query
    String selectQuery = "SELECT  * FROM " + SkippedQuestions.TABLE_NAME + " ORDER BY " +
            SkippedQuestions.ID + " DESC";

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            SkippedQuestions skippedQuestions = new SkippedQuestions();
            skippedQuestions.setId(cursor.getInt(cursor.getColumnIndex(SkippedQuestions.ID)));
            skippedQuestions.setQuestion(cursor.getString(cursor.getColumnIndex(SkippedQuestions.QUESTION)));
            skippedQuestions.setAns1(cursor.getString(cursor.getColumnIndex(SkippedQuestions.ANSONE)));
            skippedQuestions.setAns2(cursor.getString(cursor.getColumnIndex(SkippedQuestions.ANSTWO)));
            skippedQuestions.setAns3(cursor.getString(cursor.getColumnIndex(SkippedQuestions.ANSTHREE)));
            skippedQuestions.setAns4(cursor.getString(cursor.getColumnIndex(SkippedQuestions.ANSFOUR)));
            skippes.add(skippedQuestions);
        } while (cursor.moveToNext());
    }

    // close db connection
    db.close();

    // return notes list
    return skippes;
}

Вот это exception произошло

i здесь представлены в индексе ArrayList моего object'. And I tried to put 0 instead of i`, и я получаю то же исключение

Cursor rs = db.getSkip(i);
 String quest = rs.getString(rs.getColumnIndex(SkippedQuestions.QUESTION));
 if (!rs.isClosed()) {
   rs.close();
 }

1 Ответ

0 голосов
/ 29 апреля 2018

Добавьте условное выражение if (rs.moveToFirst()) между этими строками:

Cursor rs = db.getSkip(i);
String quest = rs.getString(rs.getColumnIndex(SkippedQuestions.QUESTION));

Сначала курсор указывает на строку номер -1, которая не является допустимой строкой. Попытка чтения из него приводит к исключению. Методы Cursor moveTo...() возвращают true, если перемещение прошло успешно. Если строк не было, возвращается false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...