Термин поискового запроса не должен быть префиксом каких-либо данных в Db - PullRequest
0 голосов
/ 27 мая 2020

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

sequence

собака

хор

кошка

тиг

кошка

если мой поисковый запрос doga (имеет dog как префикс в db), horrible (имеет hor как префикс в db), tiger (имеет tig как префикс в db), caterpillar (имеет cat в качестве префикса в db), запрос должен вернуть true, так как все эти поисковые запросы имеют префиксы в базе данных.

Что должен мой sql поисковый запрос?

Спасибо

1 Ответ

1 голос
/ 27 мая 2020

Если вы используете Room, вы можете попробовать следующее (используя Kotlin):

@Query("select * from User_DNA WHERE sequence LIKE :search")
fun getItem(search: String): UserDNA?

Установив параметр search для этого метода, вы должны указать шаблон поиска как "[ ваша строка поиска]% ", например:" dog% "

если мой поисковый запрос - собака, запрос должен возвращать true или один из элементов (dogsequence / doggysequence), что когда-либо эффективно

Вы можете проверить результат запроса - если он нулевой, значит, в вашем столбце нет совпадающих значений.

ОБНОВЛЕНО

Если вы хотите найти «hor» с «ужасным», я могу предложить следующий способ (возможно, это задача для RegExp, но, честно говоря, я не использовал это в КОМНАТЕ):

  1. Вы можете поместить два метода в свой DAO. Один из способов - вспомогательный, его задача - заполнить список словами, которые мы хотим найти. Например, для шаблона "ужасный" этот метод должен подготовить список с {"ужасный", "ужасный", "ужасный", "ужасный", "ужасный", "ужасный"}.
  2. Второй метод должен получить результат SQLite, где ваши поля содержат значение из списка, подготовленного на шаге 1. Этот метод должен быть аннотирован аннотацией Room.
  3. Итак, первый метод подготавливает список, вызывает запрос для поиска слова в SQLite и возвращает его в ViewModel (или репозиторий).

Что-то вроде этого :

@Query("select * from User_DNA WHERE sequence IN (:search) ORDER BY sequence")
fun getItem(search: List<String>): User_DNA?

fun findItem(search: String): User_DNA? {
    val searchList = mutableListOf<String>()
    val minimalStringLength = 2 // it's up to you, maybe 1?
    while (search.length > minimalStringLength) {
        searchList.add(search)
        search = search.dropLast(1)
    }
    return getItem(searchList.toList())
}
...