Как получить данные строки, где столбец =?также применяя лимит к строкам? - PullRequest
1 голос
/ 23 сентября 2019

Я получаю ошибку при применении необработанного запроса в sq-lite. Ошибка:

Caused by: android.database.sqlite.SQLiteException: near "Limit": syntax error (code 1): ,
 while compiling: SELECT  * FROM quiz_questions WHERE Levels = "Level 1"+ Limit 2+

Запрос SELECT * FROM quiz_questions WHERE Levels = "Level 1" работает и дает мне несколько строк, но когда я применяю ограничение к запросу,выдает ошибку.

Это код для него.

public ArrayList<Question> getLockedLevels(ArrayList<String> Level) {

        ArrayList<Question> questionList = new ArrayList<>();
        db = getReadableDatabase();

        for (int i = 0; i < Level.size(); i++)
        {

          String levelID = Level.get(i);
            String SELECT_TABLE_QUERY = "SELECT  * FROM " + TABLE_NAME + " WHERE " + COLUMN_LEVEL + " = \"" + levelID + "\"+ Limit 1";
        Cursor cursor = db.rawQuery(SELECT_TABLE_QUERY, null);
        if (cursor.moveToFirst()) {
            do {
                Question question = new Question();
                question.setmLevels(cursor.getString(cursor.getColumnIndex(COLUMN_LEVEL)));
                question.setmLevels_lockmanager(cursor.getInt(cursor.getColumnIndex(COLUMN_LEVEL_LOCKMANAGER)));
                 questionList.add(question);
            } while (cursor.moveToNext());
        }

        cursor.close();
    }
        return questionList;
    }

1 Ответ

1 голос
/ 23 сентября 2019

Попробуйте

String SELECT_TABLE_QUERY = "SELECT  * FROM " + TABLE_NAME + " WHERE " + COLUMN_LEVEL + " = '" + levelID + "' Limit 1";

Это должно измениться на: -

SELECT  * FROM quiz_questions WHERE Levels = 'Level 1' Limit 1

Однако вышеизложенное может быть потенциальным SQL-инъекцией.

Использование: -

String levelID = Level.get(i);
String SELECT_TABLE_QUERY = "SELECT  * FROM " + TABLE_NAME + " WHERE " + COLUMN_LEVEL + "=? Limit 1";
Cursor cursor = db.rawQuery(SELECT_TABLE_QUERY, new String[]{levelID });

устранит потенциал для SQL-инъекций и поэтому считается более правильным.

В качестве альтернативы вы можете использовать удобный метод запроса, который не только защищает от SQL-инъекций, но и генерирует большую частьSQL.

Таким образом, вы можете использовать: -

for (int i = 0; i < Level.size(); i++) {
    Cursor cursor = db.query(TABLE_NAME,null,COLUMN_LEVEL + "=?",new String[]{Level.get(i)},null,null,null,"1");
    while (cursor.moveToNext()) {
        Question question = new Question();
        question.setmLevels(cursor.getString(cursor.getColumnIndex(COLUMN_LEVEL)));
        question.setmLevels_lockmanager(cursor.getInt(cursor.getColumnIndex(COLUMN_LEVEL_LOCKMANAGER)));
        questionList.add(question);
    }
    cursor.close();
}

См. SQliteDatabase - запрос

Выше также используется более короткое значение while(cursor.moveToNext) { ..... } для циклачерез Курсор (если строк нет, цикл не вводится, так как moveToNext вернет false, если перемещение не может быть выполнено)

...