Предполагается, что вы ожидаете, что определение внешнего ключа автоматически извлечет данные в соответствии с определенными внешними ключами. Это не будет иметь место. Все, что определяет внешний ключ, это добавляет ограничение (правило), которому нужно следовать, говоря, что для вставки строки в таблицу (дочерний), которая ссылается на другую таблицу MUST (если foreignKey Ограничения Включено это правда). Таким образом, вы должны JOIN таблицы ON ссылка для получения данных из обеих таблиц.
Предполагая, что у вас есть две таблицы
опросник который имеет;
- столбец для id отдельного опросника (_id на картинке),
- столбец для имени и
- столбец для уровня (не уверен, почему идентификатор на вашей картинке, просто кажется, что число достаточно, так как на рисунке показано, что строки имеют одинаковый уровень)
и вопрос который имеет;
Затем используйте следующую команду для заполнения таблиц: -
DROP TABLE IF EXISTS question;
DROP TABLE If EXISTS quizlist;
CREATE TABLE IF NOT EXISTS quizlist (ID INTEGER PRIMARY KEY, level INTEGER, name TEXT);
CREATE TABLE IF NOT EXISTS question (ID INTEGER PRIMARY KEY, question TEXT, quizlist_reference REFERENCES quizlist(id));
INSERT INTO quizlist (level,name) VALUES (1,'P 1'), (1,'P 2'),(1,'P 3'),(2,'P 4'),(2,'P 5'),(3,'P 6'),(3,'P 7');
INSERT INTO question (question, quizlist_reference) VALUES
('Q1',1),('Q2',6),('Q3',2),('Q4',4),('Q5',3),('Q6',1),('Q7',1),('Q8',1),('Q9',3),('Q10',3),('Q11',3),
('Q12',2),('Q13',4),('Q14',5),('Q15',3),('Q16',4),('Q17',6);
приведет к двум таблицам: -
викторина : -
![enter image description here](https://i.stack.imgur.com/zx2zg.png)
вопрос : -
![enter image description here](https://i.stack.imgur.com/ybXbb.png)
Как видно, уровень и название уровня не включены, данные собраны. Вместо этого, если вы выполнили запрос SELECT, используя (вопрос касается только данных, удобных для пользователя, это имя уровня и его уровень): -
SELECT question, name, level
FROM question
JOIN quizlist ON quizlist.id = quizlist_reference
ORDER BY question ASC;
Результат будет: -
![enter image description here](https://i.stack.imgur.com/TpwTx.png)
- Сортировка заметок (ORDER BY) по вопросам в данном случае не поможет.
- Как видно по каждому вопросу, соответствующий уровень и название уровня теперь получаются.
Теперь просто выбрать все вопросы для уровня, все, что нужно, это предложение WHERE, например. WHERE level = 1
будет включено.
Итак, используя: -
SELECT question
FROM question
JOIN quizlist ON quizlist.id = quizlist_reference
WHERE level = 1
ORDER BY question ASC;
Результатом будет: -
![enter image description here](https://i.stack.imgur.com/MwF6v.png)
Аналогично: -
SELECT question
FROM question
JOIN quizlist ON quizlist.id = quizlist_reference
WHERE level = 2
ORDER BY question ASC;
Результатом будет: -
![enter image description here](https://i.stack.imgur.com/rnXJ2.png)
Невозможно дать более конкретный ответ, не угадав, так как в вопросах нет указаний относительно внешних ключей, определений столбцов и т. Д. Таким образом, вам необходимо будет применять принципы, показанные соответствующим образом.
Применение запроса к Android
Обратите внимание, что для использования метода SQLiteDatabse query таблица вместе с JOIN предоставляется через первый параметр в виде строки.
Кроме того, если у вас есть одинаковые именованные столбцы (например, в приведенном выше примере в обеих таблицах есть столбец id ), курсор не содержит имя таблицы, поэтому у курсора будут столбцы с одинаковым именем и Метод getColumnIndex не обязательно будет получать правильные данные (я верю, что он получит последний такой столбец). Поэтому желательно давать столбцам конкретные имена с предложением AS (это как часть второго параметра).
Таким образом, используя адаптацию вашего кода для соответствия приведенным выше таблицам, метод, подобный следующему, может получить вопросы на определенном уровне: -
public ArrayList<Question> getQuestionsByLevel(int level) {
ArrayList<Question> questionList = new ArrayList<>();
db = getReadableDatabase();
String table = QuestionsTable.TABLE_NAME +
" JOIN " + QuizListTable.TABLE_NAME +
" ON " + QuizListTable.COLUMN_ID + "=" + QuestionsTable.COLUMN_QUESTIONS_QUIZ_LIST_REFERENCE;
String[] columns = new String[]{
QuestionsTable.COLUMN_ID +
" AS " + QuestionsTable.TABLE_NAME + "_" + QuestionsTable.COLUMN_ID, //<<<<<<<< make returned ID column (from questions table) unique name
QuestionsTable.COLUMN_QUESTION,
QuizListTable.COLUMN_ID +
" AS " + QuizListTable.TABLE_NAME + "_" + QuizListTable.COLUMN_ID, //<<<<<<<<<< make returned ID column (from quizlist table) unique name
QuizListTable.COLUMN_LEVEL,
QuizListTable.COLUMN_NAME
};
String selection = QuizListTable.COLUMN_QUIZ_LIST_LEVEL + "= ?";
String[] selectionArgs = new String[]{String.valueOf(quizListID)};
Cursor c = db.query(
table,
columns,
selection,
selectionArgs,
null,
null,
null
);
...............
- Примечание Вышеуказанное предназначено только в качестве принципиального примера. Он не был проверен, поэтому может содержать некоторые ошибки. Дополнительно: -
- Константы соответствуют тому, как они могут быть закодированы на основе того, что представляется конвенциями (не собирался тратить время на расшифровку предоставленного ограниченного кода)
- Дополнительные столбцы добавлены для демонстрации, выше будет равно
SELECT question.id AS question_id,question,quizlist.id AS quizlist_id, level, name FROM question JOIN quizlist ON quizlist.id = quizlist_reference WHERE level = 2