SQLite анализирует данные курсора

#android #sqlite

#Android #sqlite

Вопрос:

Я кодирую тест и записываю отдельные ответы в базу данных SQLite. Моя таблица имеет следующий формат:

Идентификатор, сеанс, RightWrong
1, 042102111244, 0
2, 042102111244, 1
3, 042102111244, 1
4, 042102111244, 1
5, 042102111244, 0
6, 042102111412, 0
7, 042102111412, 1
8, 042102111412, 0
9, 042102111412, 1

Где «сеанс» относится ко времени запуска определенного теста, и каждая строка представляет собой один ответ (0 = неправильный ответ, 1 = Правильный).

Меня волнует только «совокупность», то есть на сколько вопросов были даны правильные ответы (и из скольких вопросов) за тест.

Итак, курсор моей «мечты» был бы:

Сессия, правильные ответы, полное отсутствие вопросов
042102111244, 3, 5
042102111412, 2, 4

Есть ли способ добиться этого? У меня возникли проблемы с определением подходящего запроса (который, по общему признанию, является не столько проблемой программирования, сколько логической проблемой).

На данный момент я просто считываю все записи в курсор
Cursor cursor = db.query(MyDataSQLHelper.TABLE, null, null, null, null,
null, null);
и подумал, что я предпочел бы выполнить некоторую «постобработку», но не уверен, какой подход лучше.

Спасибо за вашу помощь,
Ник

Ответ №1:

Простой необработанный запрос был бы таким:

 Cursor cursor = db.rawQuery("select session, sum(rightwrong) as RightAnswers, count(rightWrong) as TotalNoOfQuestions from tablename group by session");
  

Вы будете использовать Group By для объединения всех строк, относящихся к одному сеансу, вместе, затем используйте функции sum и count для определения разбивки внутри сеанса. Обратите внимание, что «сумма» здесь работает только потому, что правильные ответы равны 1, а неправильные ответы равны 0, если вы измените способ записи ответов, вам придется немного изменить запрос.

Я попытаюсь угадать, как будет выглядеть вызов db.query:

 String[] columns = {"Session", "sum(RightWrong) as RightAnswers", "count(RightWrong) as TotalNoOfQuestions";
String[] groupBy = {"Session"};


Cursor cursor = db.query("tablename", columns, null, null, groupBy, null, null);
  

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

Ответ №2:

Вы используете предложение group by.

Вы используете общедоступный запрос курсора (строка table, Строка[] columns, выбор строки, String[] selectionArgs, String groupBy, String having, String OrderBy)

например. Cursor курсор = db.query(MyDataSQLHelper.ТАБЛИЦА, новая строка[] {«Сессия», «сумма (RightWrong) правильных ответов», «количество (сеансовых) итоговых вопросов»}, null, «Сессия», null, null);

Вы пытаетесь снова.