Помещаем результаты SQLite в объект Java

#android #sqlite

#Android #sqlite

Вопрос:

Я разрабатываю игру-викторину на Android и пытаюсь сохранить совпадение пользователя с SQLite.

У меня есть две таблицы:

 MATCH
-id
-description

QUESTION
-id
-id_match
-question
  

У меня есть объекты Match и Question на Java. Match Объект имеет ArrayList<Question> .

Нет проблем с сохранением данных.

Мне нужно получить из базы данных все совпадения со всеми связанными вопросами.

Это мой запрос:

 SELECT * FROM matches LEFT JOIN questions ON matches.id = questions.id_match
  

И вот как я выполняю запрос:

 Cursor cursor = db.rawQuery(query, null);
  

Как я могу выполнить итерацию курсора, чтобы получить ArrayList<Match> ?

Ответ №1:

Этот запрос:

 SELECT * FROM matches LEFT JOIN questions ON matches.id = questions.id_match
  

будет получено 5 столбцов, и 2 из них будут иметь одинаковое имя: id .
Я считаю, что лучше изменить запрос следующим образом:

 SELECT m.id mid, m.description, q.id qid, q.id_match, q.question 
FROM matches m LEFT JOIN questions q ON m.id = q.id_match 
  

Таким образом, имена столбцов все разные.
Теперь, после выполнения:

 Cursor cursor = db.rawQuery(query, null);
  

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

 while (cursor.moveToNext()) {
    String mid = cursor.getString(cursor.getColumnIndex("mid"));
    String description = cursor.getString(cursor.getColumnIndex("description"));
    String qid = cursor.getString(cursor.getColumnIndex("qid"));
    String id_match = cursor.getString(cursor.getColumnIndex("id_match"));
    String question = cursor.getString(cursor.getColumnIndex("question"));
    // here write your code
}
  

Если mid , qid и id_match являются не строками, а целыми числами, замените на getInt() вместо getString() .

Комментарии:

1. Моя проблема именно в том, где вы написали // здесь напишите свой код. Как я могу узнать, является ли текущий курсор новым совпадением или просто еще одним вопросом для добавления к совпадению?

2. Я предлагаю вам отредактировать свой вопрос, чтобы вы четко объяснили свою проблему. Поскольку ваш вопрос сейчас, это не подразумевает ничего из того, что вы сказали в своем комментарии. Также опубликуйте весь соответствующий код, который у вас есть.

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

4. Каждая строка курсора содержит как объединенную строку из совпадений, так и вопросов.

Ответ №2:

 SELECT M.id as match_id, M.description, Q.id as ques_id, Q.id_match, Q.question FROM matches M LEFT JOIN questions Q ON matches.id = questions.id_match
  

Вы можете выполнять итерацию курсора следующим образом:

     while (cursor.moveToNext()) {
        String match_id = cursor.getString(cursor.getColumnIndex("match_id"));
        String description = cursor.getString(cursor.getColumnIndex("description"));
        String ques_id= cursor.getString(cursor.getColumnIndex("ques_id"));
        String id_match= cursor.getString(cursor.getColumnIndex("id_match"));
    }