Android SimpleCursorAdapter с запросами с использованием DISTINCT

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

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

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

SELECT DISTINCT category FROM table;

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

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

Ответ 1

Здесь запрос, в котором я закончил:

SELECT _id, category FROM table_name GROUP BY category;

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

Рассматривайте пользователя Al Sutton и ответьте на этот вопрос, так как это может быть более элегантное решение этой проблемы.

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

Ответ 2

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

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

Ответ 3

SELECT DISTINCT category,_id FROM table GROUP BY category;

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

Ответ 4

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

SELECT DISTINCT 0 _id, category FROM table;

Ответ 5

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

SELECT DISTINCT category AS _id FROM table

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