SQLiteOpenHelper нет ответа на запрос - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь сделать свое приложение, это своего рода словарь с обучающим персоналом. Но я застрял в этот момент: Мне нужно вставить статистику слова (правильный и неправильный ответ), но все запросы заканчиваются ошибками:

<code>E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.maxvek.myapplication, PID: 9088
android.database.CursorIndexOutOfBoundsException:Index -1 requested,with a size of 1</code>

или как-то так:

no response from DB

Я попытался сделать такой же запрос на sqliteonline и эта работа.

Я просто не знаю, что делать. Я читаю кое-что и думаю, что мне нужен обратный звонок. Но я новичок в Java и даже не могу понять, как это сделать.

Мой класс:

DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper {
sqLiteDatabase.execSQL("create table " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT,uk TEXT, en TEXT, ru TEXT, de TEXT, fr TEXT)");
sqLiteDatabase.execSQL("create table " + TABLE_STAT_WORD + " (id INTEGER PRIMARY KEY AUTOINCREMENT,uk TEXT, en TEXT, ru TEXT, de TEXT, fr TEXT, cor INTEGER, incor INTEGER)");
...

public void insertStatWord(String word, String lang, Boolean answer) {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select id from " + TABLE_NAME + " where " + lang + " = '" + word + "' limit(1)", null);
    String id = res.getString(0);
    if (answer) {
        Cursor update = db.rawQuery("update " + TABLE_STAT_WORD + " set cor = cor+1 WHERE " + lang + " = " + id, null);
        if (update == null) {
            ContentValues contentValues = new ContentValues();
            contentValues.put(lang, id);
            contentValues.put("cor", 1);
            db.insert(TABLE_STAT_WORD, null, contentValues);
        }
    } else {
        Cursor update = db.rawQuery("update " + TABLE_STAT_WORD + " set incor = incor+1 WHERE " + lang + " = " + id, null);
        if (update == null) {
            ContentValues contentValues = new ContentValues();
            contentValues.put(lang, id);
            contentValues.put("incor", 1);
            db.insert(TABLE_STAT_WORD, null, contentValues);
        }
    }
...
}

DatabaseInstance

public class DatabaseInstance {
private static DatabaseInstance ourInstance = new DatabaseInstance();
private DatabaseHelper myDB;

private DatabaseInstance() {
}

public static DatabaseInstance getInstance() {
    return ourInstance;
}

public synchronized void init(Context context) {
    if (myDB == null) {
        myDB = new DatabaseHelper(context);
    }
}

public DatabaseHelper getMyDB() {
    return myDB;
}
}

Из этого фрагмента я пытаюсь вызвать этот метод:

TrainingFragment

private void statOfWord(String word, String lang, boolean answer) {
    DatabaseInstance.getInstance().getMyDB().insertStatWord(word, lang, answer);
    }

1 Ответ

0 голосов
/ 12 ноября 2018

Курсор, возвращаемый этим:

Cursor res = db.rawQuery("select id from " + TABLE_NAME + " where " + lang + " = '" + word + "' limit(1)", null);

может содержать или не содержать 1 строку, поэтому вы должны проверить это:

String id = "";
if (res.moveToFirst()){
    id = res.getString(cursor.getColumnIndex(0));
}
if (id.isEmpty())
    return;


Также в вашем коде вам нужно дважды выполнять операторы обновления, но вы делаете это, выполняя неправильный метод.
Метод rawQuery() используется для извлечения данных из таблицы с помощью оператора SELECT, а не для обновления данных.
Вместо этого вы должны использовать метод execSQL(), который ничего не возвращает, например:

db.execSQL("update " + TABLE_STAT_WORD + " set cor = cor + 1 WHERE " + lang + " = " + id);

и

db.execSQL("update " + TABLE_STAT_WORD + " set incor = incor + 1 WHERE " + lang + " = " + id);
...