SQLite на Android: союз с ограничениями альтернативы - PullRequest
2 голосов
/ 26 июля 2010

Я хочу создать Cursor, который позже я передам через CursorAdapter на AutoCompleteTextView для предложений по автозаполнению.Проблема в том, что мой оператор SQL должен выбрать 2 разных набора результатов из одной таблицы, просто отсортированные по разным критериям.В то же время эти наборы результатов не должны пересекаться - иначе у меня было бы несколько одинаковых предложений.На MySQL это было бы довольно просто:

(SELECT field3 FROM table ORDER BY field1 ASC LIMIT 5)
UNION
(SELECT field3 FROM table ORDER BY field2 DESC LIMIT 10)
LIMIT 10

В этом случае у меня всегда было бы до 10 уникальных значений.На SQLite, к сожалению, это не так - у меня не может быть ограничений на отдельные выборки, только на весь набор результатов, что делает UNION вообще бесполезным для этого случая ...

Для решения этой проблемыЯ думал о том, чтобы сделать 2 запроса отдельно: итерацию по Cursor из 1-го запроса и помещение значений в Array, затем итерирование по Cursor из 2-го запроса, а также помещение значений в тот же массив при проверке и пропуске уже существующихзначения в Array, чтобы избежать дубликатов.Затем используйте ArrayAdapter для передачи значений в AutoCompleteTextView.

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

Может быть, есть лучший и более простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Рассматривали ли вы ограничение искусственного интеллекта, чтобы выбрать из середины набора записей.Позвольте мне представить идею в примере

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

SELECT field3 FROM table ORDER BY field1 DESC

Пример:

field1 | field2
12       x
11       x
9        x 
8        x
7        x
6        x
5        x
4        x
3        x
2        x
1        x

Затем выполните второй запрос в нужном вам порядке.Ограничения здесь не применяются.

SELECT field3 FROM table ORDER BY field2 DESC

Затем объедините их

(SELECT field3 FROM table ORDER BY field1 DESC)
UNION
(SELECT field3 FROM table ORDER BY field2 DESC)

Результаты, которые вы хотите, находятся в середине набора результатов

field1 | field2
11       x
10       x
9        x 
8        x
7        x
6        x
----------
5        x
4        x
3        x
2        x
1        x
x        1
x        2
x        3 
x        4
x        5
x        6
x        7
x        8
x        9
x        10
----------
x        11

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

Окончательный запрос будет выглядеть примерно так:

(SELECT field3 FROM table ORDER BY field1 DESC)
UNION
(SELECT field3 FROM table ORDER BY field2 DESC)
LIMIT 5+10 OFFSET N-5

Я написал LIMITS явно, чтобы иметь возможность рассчитать его самостоятельно, смещение N-5 означает пропуск N-5 записей с начала набора записей.

1 голос
/ 22 августа 2010

Следующие результаты будут такими же, как в примере с MySQL:

CREATE TABLE IF NOT EXISTS unionTemp ( field3 TEXT)
DELETE FROM unionTemp

INSERT INTO unionTemp SELECT field3 FROM table ORDER BY field1 ASC LIMIT 5
INSERT INTO unionTemp SELECT field3 FROM table ORDER BY field2 ASC LIMIT 10

SELECT field3 FROM unionTemp GROUP BY field3 LIMIT 10

Вы можете использовать временную таблицу. (СОЗДАТЬ ТАБЛИЦУ ТЕМПЕРАТУР ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...