Фильтрация выделения строк по 2 параметрам в SQLite - PullRequest
0 голосов
/ 04 апреля 2019

Не могу понять, как правильно фильтровать мои объединенные таблицы. Когда я использую:

String selection = " quiz_list_id " + " = ? " + " AND " + " LevelID " + " = ? ";

Ничего не происходит, когда я нажимаю кнопку с правильно назначенным именем из базы данных. Куда мне обратиться, чтобы добавить недостающие параметры?

 public ArrayList<Question> getNLevelQuestions( int TestLevelID, int quizListID) {
    ArrayList<Question> questionList = new ArrayList<>();
    db = getReadableDatabase();


    String table = QuestionsTable.TABLE_NAME + " JOIN " + QuizListTable.TABLE_NAME +
            " ON " + QuizListTable._ID + " = " + QuestionsTable.COLUMN_QUIZ_LIST_ID;


    String selection = "quiz_list_id" + " = ? " + " AND " + "LevelID" + " = ?";

    String[] selectionArgs = new String[]{String.valueOf(quizListID), String.valueOf(TestLevelID)};

    Cursor c = db.query(table,
            null,
            selection,
            selectionArgs,
            null,
            null,
            null
    );
if (c.moveToFirst()) {
        do {
            Question question = new Question();
            question.setId(c.getInt(c.getColumnIndex("question_id")));
            question.setQuestion(c.getString(c.getColumnIndex("question")));
            question.setOption1(c.getString(c.getColumnIndex("option1")));
            question.setOption2(c.getString(c.getColumnIndex("option2")));
            question.setOption3(c.getString(c.getColumnIndex("option3")));
            question.setOption4(c.getString(c.getColumnIndex("option4")));
            question.setAnswerNB(c.getInt(c.getColumnIndex("answer_nb")));
            question.setQuizListID(c.getInt(c.getColumnIndex("quiz_list_id")));
            questionList.add(question);
        } while (c.moveToNext());
    }

    c.close();
    return questionList;
}

Вот моя StartingScreenActivity, которая передает информацию в основную деятельность

PracticeList = findViewById(R.id.Practice_n_group);
    for(int i=0; i<categorySize;i++){

        practiceButton = new Button(this);
        practiceButton.setText("" + categoryName.get(i));
        practiceButton.setId(i+1);
        final int index = i;
        practiceButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        practiceButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                startQuiz(v.getId(), categoryName.get(index).toString());
            }
        });
        // adding button to layout
        PracticeList.addView(practiceButton);
    }
}

private void startQuiz(int practiceListID, String quizListName) {
    Intent intent = new Intent(StartingScreenActivity.this, MainActivity.class);
    intent.putExtra(EXTRA_PRACTICE_ID, practiceListID);
    intent.putExtra(EXTRA_PRACTICE_NAME, quizListName);
    startActivityForResult(intent, REQUEST_CODE_QUIZ);
}

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Вы не можете использовать метод query () для оператора SQL, но только для запроса таблицы.Вы должны использовать метод rawQuery () .Поэтому установите полный оператор SQL следующим образом:

String sql ="SELECT .... WHERE LevelID  = ? and quiz_list_id = ?";

, а затем:

String[] selectionArgs = new String[]{ String.valueOf(JLPTID), String.valueOf(quizListID)};
Cursor c = db.rawQuery(sql, selectionArgs);

Примечание : в своем операторе SQL используйте правильные квалификаторы для столбцов, поэтомунет двусмысленных имен столбцов.

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

Всем спасибо за предложения.В конечном итоге проблема заключалась в том, что я не передал один из параметров из моего запроса в метод startQuiz.Вместо этого я передавал идентификатор выбранной кнопки.

Изменения:

с

 startQuiz(v.getId(), categoryName.get(index).toString());

на

 startQuiz(TestLevel, categoryName.get(index).getId(), categoryName.get(index).toString());

и в методе ниже добавленеще один обязательный параметр:

private void startQuiz(int testLevel, int practiceListID, String quizListName) {
    Intent intent = new Intent(StartingScreenActivity.this, MainActivity.class);
    intent.putExtra(EXTRA_LEVEL_ID, testLevel);
    intent.putExtra(EXTRA_PRACTICE_ID, practiceListID);
    intent.putExtra(EXTRA_PRACTICE_NAME, quizListName);
    startActivityForResult(intent, REQUEST_CODE_QUIZ);
}
0 голосов
/ 04 апреля 2019

Пожалуйста, попробуйте как ниже (обновите ваш запрос, а также строку выбора аргументов):

String table = "SELECT * FROM " + QuizListTable.TABLE_NAME + " a INNER JOIN " + QuestionsTable.TABLE_NAME + " b ON " + QuizListTable._ID + " = " + QuestionsTable.COLUMN_QUIZ_LIST_ID;

String[] columns = new String[]{
            "question_id",
            "question",
            "option1",
            "option2",
            "option3",
            "option4",
            "quiz_list_id",
            "answer_nb",
            "_id",
            "name",
            "LevelID"

    };
String selection = " b.LevelID=? " + " AND " + " a.quiz_list_id=?";

String[] selectionArgs = new String[]{ String.valueOf(JLPTID), String.valueOf(quizListID)};

    Cursor c = db.query(
            table,
            columns,
            selection,
            selectionArgs,
            null,
            null,
            null
    );
...