В Android sqlite LIKE
и GLOB
игнорируют COLLATE LOCALIZED
и COLLATE UNICODE
(они работают только для ORDER BY
).Однако, как @asat объясняет в его ответ , вы можете использовать GLOB
с шаблоном, который заменит каждую букву всеми доступными альтернативами этой буквы.В Java:
public static String addTildeOptions(String searchText) {
return searchText.toLowerCase()
.replaceAll("[aáàäâã]", "\\[aáàäâã\\]")
.replaceAll("[eéèëê]", "\\[eéèëê\\]")
.replaceAll("[iíìî]", "\\[iíìî\\]")
.replaceAll("[oóòöôõ]", "\\[oóòöôõ\\]")
.replaceAll("[uúùüû]", "\\[uúùüû\\]")
.replace("*", "[*]")
.replace("?", "[?]");
}
И затем (конечно, не буквально так):
SELECT * from table WHERE lower(column) GLOB "*addTildeOptions(searchText)*"
Таким образом, например, на испанском языке, пользователь ищет либо mas или más преобразует поиск в m [aáàäâã] s , возвращая оба результата.
Важно отметить, что GLOB
игнорирует COLLATE NOCASE
, поэтому я преобразовал все в нижний регистр как в функции, так и в запросе.Также обратите внимание, что функция lower()
в sqlite не работает с не-ASCII-символами - но, опять же, это те, которые вы уже заменяете!
Функция также заменяет оба GLOB
подстановочных знака, *
и ?
, с «экранированными» версиями.