在 Android sqlite 中,LIKE
忽略GLOB
and 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
ignores COLLATE NOCASE
,这就是为什么我在函数和查询中都将所有内容都转换为小写。另请注意lower()
,sqlite 中的函数不适用于非 ASCII 字符 - 但这些可能是您已经替换的字符!
该函数还将GLOB
通配符*
和?
, 替换为“转义”版本。