Android SQLite: соединения и курсор

У меня есть следующие таблицы в базе данных sqlite:

items
______
 _id (PK)
name
section_subsection_id (FK)

section_subsections
______
_id (PK)
section_id (FK)
subsection_id (FK)

subsections
______
_id (PK)
name

sections
______
_id (PK)
name

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

Я использовал несколько запросов, вот один из них:

String selectQuery = "Select subsections.name, subsections._id, temp.count as count 
FROM subsections LEFT JOIN 
sections_subsections ON subsections._id = sections_subsections.subsection_id 
JOIN items (SELECT count(items._id) as count from items) temp 
ON items.section_subsection_id = sections_subsections._id 
WHERE subsections.name LIKE 'keyword' AND sections_subsections.section_id = 1 ORDER BY
subsections.name ASC LIMIT 50 OFFSET 0 ";

Когда я пытаюсь просмотреть результаты, я получаю список, соответствующий поиску по ключевому слову, но счетчик всегда отображает последнее значение счетчика из набора результатов. Когда я запускаю необработанный запрос в оболочке sqlite, я вижу правильные подсчеты в столбце с соответствующими строками, но при повторении курсора в Android/Java возникают проблемы. Или, возможно, мой запрос?

Таким образом, для ListView в приложении я получу те же значения (то есть все 20), но в оболочке я вижу count с правильным значением. На самом деле, во время итерации курсора, если я вывожу на экран count Log.d, это также все 20, но другое значение столбца name отличается. Что не так с моим запросом? Или как мне правильно перебирать таблицу с несколькими соединениями?

_id  name    count 
 ---------------   
1    item1   79
2    item2   30
3    item3   20

РЕДАКТИРОВАТЬ: я делаю что-то подобное на Java:

Cursor cursor = sqliteDatabase.rawQuery(selectQuery, null);
if (cursor != null) {
cursor.moveToFirst();
}

if (cursor.moveToFirst()) {
do {
SubSection subSection = new SubSection();                      
subSection.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));                     subSection.setSubSectionName(cursor.getString(cursor.getColumnIndex(KEY_TABLE_SUBSECTIONS_SUBSECTION_NAME)));
subSection.setRecords(cursor.getColumnIndex("count"));
subSections.add(subSection);
}
while 
(cursor.moveToNext());
}

person Harvester316    schedule 28.05.2014    source источник


Ответы (2)


попробуйте запрос ниже

Select subsections.name, subsections._id, (SELECT count(items._id) from items WHERE items.section_subsection_id = sections_subsections._id) as count 
FROM subsections LEFT JOIN 
sections_subsections ON subsections._id = sections_subsections.subsection_id 
WHERE subsections.name LIKE 'keyword' AND sections.name = 'Category' ORDER BY
subsections.name ASC LIMIT 50 OFFSET 0 ";
person Syed Waqas    schedule 28.05.2014
comment
Спасибо! Где должна быть вторая закрывающая скобка? - person Harvester316; 28.05.2014
comment
сразу после окончания подзапроса вы запустили код? - person Syed Waqas; 28.05.2014
comment
Хорошо, я пробовал. Возвращает то же самое. Значение последнего результата подсчета; Чтобы проверить, я использовал Log во время итерации курсора: Log.d(LOG, cursor.getColumnIndex("count") + ""); Я выполнил эту команду sql в оболочке sqlite и вижу правильный счет, как и в случае с моими предыдущими запросами. - person Harvester316; 28.05.2014
comment
если приведенный выше Log.d(LOG, cursor.getColumnIndex(count) + ) печатает то, что вы ожидаете, проверьте, может ли ваша модель что-то не так с subSection.setRecords(...), попробуйте напечатать Log.d(LOG, String. valueOf (subSection.getRecords()))) чтобы увидеть, правильно ли назначено значение или сообщение, где вы используете подменю во внешнем интерфейсе - person Syed Waqas; 28.05.2014
comment
Нет, он не печатает то, что я ожидаю. Он печатает значение счетчика последней записи 50 раз, поскольку у нас есть предел/результат, равный 50. Я могу видеть, что я ожидаю, через оболочку терминала. - person Harvester316; 28.05.2014
comment
sections.name = 'Category' на самом деле должно быть: sections_subsections.section_id = 1 - person Harvester316; 28.05.2014

Спасибо, Сайед Вакас, ваш ответ правильный для присоединения. Проблема была не в моих запросах на самом деле. Это был мой вызов курсора. Я должен был использовать: cursor.getInt(cursor.getColumnIndex("count")) вместо того, что у меня было в исходном вопросе. Не знаю, как мне удалось не заметить эту большую ошибку. Для всех остальных вы можете отладить свой курсор с помощью прекрасного DatabseUtils. :)

Log.d(LOG, "ROW: " + DatabaseUtils.dumpCursorToString(cursor)); 
person Harvester316    schedule 28.05.2014