Sqlite - Показать результаты в желаемом порядке - PullRequest
1 голос
/ 23 июня 2019

Я создал таблицу sqlite с двумя столбцами - Код и Имя и сохранил в ней данные.Пользователю предоставляется вид поиска для ввода кода или имени, и приложение отображает результаты соответствующим образом.

Я использую запрос ниже, чтобы получить результаты-

cursor = db.query(TABLE_SEARCH, columns, COLUMN_CODE + " LIKE '" +
        searchText + "%' or " + COLUMN_ NAME + " LIKE '%" + searchText + "%'", null, null, null, null)

Но проблема в том, что не показываетРезультаты в желаемом порядке.Я хочу показать результаты в следующем порядке:

1.Вверху отображаются результаты с кодом, точно совпадающим с искомым текстом.

2. Ниже показаны результаты с именем, точно совпадающим с искомым.text.

3. Ниже отображаются результаты с кодом, начинающимся с искомого текста.

4. Ниже отображаются результаты с именем, содержащим искомый текст.

ЕслиЯ запускаю несколько sqlite запросов, это замедляет поиск. Как я могу выполнить свое требование наилучшим образом, не влияя на производительность?

1 Ответ

1 голос
/ 23 июня 2019

Последний аргумент метода query() - это предложение ORDER BY.Попробуйте условную сортировку:

cursor = db.query(
    TABLE_SEARCH, 
    columns, 
    COLUMN_CODE + " LIKE '" + searchText + "%' OR " + 
    COLUMN_ NAME + " LIKE '%" + searchText + "%'", 
    null, 
    null, 
    null, 
    "CASE " + 
    "WHEN " + COLUMN_CODE + " = '" + searchText + "' THEN 1 " +
    "WHEN " + COLUMN_ NAME + " = '" + searchText + "' THEN 2 " +
    "WHEN " + COLUMN_CODE + " LIKE '" + searchText + "%' THEN 3 " +
    "WHEN " + COLUMN_ NAME + " LIKE '%" + searchText + "%' THEN 4 " + 
    "END, " + COLUMN_CODE + ", " + COLUMN_ NAME
)

Для повышения производительности следует установить индексы для столбцов COLUMN_CODE и COLUMN_ NAME.Кроме того, объединяя так много строк, вы рискуете sql инъекция .Я надеюсь, что вы проверите, если searchText содержит одинарные кавычки и измените их на двойные одинарные кавычки, например:

searchText = searchText.replace("'", "''");
...