SimpleCursorAdapter для Android с запросами, использующими DISTINCT - PullRequest
11 голосов
/ 15 февраля 2011

Вот интересный вопрос, который я в шоке, чаще всего не задавался в Интернете. CursorAdapters для Android чрезвычайно полезны после того, как вы запустите ContentProvider и узнаете, как его использовать, но они ограничены из-за необходимости наличия поля _id в качестве части их запроса (без него выдается ошибка). И вот почему:

Моя конкретная проблема заключается в том, что у меня есть два счетчика: один счетчик должен содержать уникальные имена "категорий" из базы данных, а другой должен заполняться всеми записями базы данных из выбранной "категории" (категория является именем столбца, здесь ). Это похоже на довольно простую установку, которую могут использовать многие программы, не так ли? Попытка реализовать этот первый блесна - вот где я столкнулся с проблемами.

Вот запрос, который я хотел бы получить для этого первого счетчика:

SELECT DISTINCT category FROM table;

Выполнение этого запроса приводит к возникновению ошибки в CursorAdapter, поскольку столбец _id является частью запроса. Добавление столбца _id в проекцию естественным образом возвращает каждую строку таблицы, поскольку теперь вы также запрашиваете разные идентификаторы, и каждый идентификатор отличается (по определению). Очевидно, что я предпочел бы видеть только одну запись на название категории.

Я уже реализовал обходной путь, который заключается в том, чтобы просто выполнить приведенный выше запрос и затем скопировать результаты в ArrayAdapter. Моя причина для этого поста состоит в том, чтобы увидеть, было ли более изящное решение этой странной маленькой проблемы, и начать обсуждение того, что я мог бы сделать лучше. Альтернативные предложения по реализации, такие как использование различных видов элементов управления или адаптеров, очень приветствуются.

Ответы [ 5 ]

6 голосов
/ 15 марта 2011

Вот запрос, с которым я закончил:

SELECT _id, category FROM table_name GROUP BY category;

Для этого я использовал функцию rawQuery () объекта SQLiteDatabase. Часть «GROUP BY» была ключом к достижению правильных результатов, поэтому спасибо пользователю Sagar за то, что он указал мне правильное направление.

Обдумайте также ответ пользователя Аль Саттона на этот вопрос, так как это может быть более элегантным решением этой проблемы.

Спасибо всем!

4 голосов
/ 15 февраля 2011

Я бы посоветовал иметь отдельную таблицу, содержащую только _id & category, которая содержит по одной строке для каждой уникальной категории. Ваши строки данных могут затем заменить свое поле категории на _id из таблицы категорий.

Это дает дополнительное преимущество: вы можете изменить категорию в таблице категорий, и она будет отображаться во всех записях в этой категории.

3 голосов
/ 15 февраля 2011
SELECT DISTINCT category,_id FROM table GROUP BY category;

Я думаю это должно дать вам то, что вы ищете. Результатом будет категория и первый _id для этой категории. Вы можете игнорировать второй столбец (_id).

0 голосов
/ 07 февраля 2014

Еще лучше, я решил эту проблему с помощью:

SELECT DISTINCT category AS _id FROM table

Теперь у вас есть столбец с именем _id, в котором есть то, что вы хотите

0 голосов
/ 15 февраля 2011

Вы можете указать псевдоним поля _id в своем операторе выбора, который является просто постоянным значением, например:

SELECT DISTINCT 0 _id, category FROM table;

...