如何在SQLite查询中忽略重音(Android)
我是新的adnroid,我正在查询sqlite,但问题是当我在我的string中使用重音。 例如:
- AAA
- AAA
- AAA
- AAA
- AAA
- AAA
如果我做:
SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%a%' ORDER BY MOVIE_NAME;
这是回报:
- AAA
- aaa(忽略其他)
但是,如果我这样做:
SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%à%' ORDER BY MOVIE_NAME;
这是回报:
- ààà(忽略标题“ÀÀ”)
我想在SQLite数据库中selectstring,而不必关心重音和大小写。 请帮忙。
通常,SQL中的string比较由列或expression式COLLATE
规则控制。 在Android中,只有三种sorting顺序是预定义的 :BINARY(默认),LOCALIZED和UNICODE。 它们都不适合您的使用情况,不幸的是,在Java API中没有提供用于安装新的sorting规则函数的C API。
要解决这个问题:
- 将另一列添加到您的表格,例如
MOVIE_NAME_ASCII
-
将值存储到删除了重音符号的列中。 您可以通过将您的string标准化为Unicode Normal Form D(NFD)并删除非ASCII代码点来删除重音符号,因为NFD粗略地将重音字符表示为纯ASCII +组合重音标记:
String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD) .replaceAll("[^\\p{ASCII}]", "");
-
你的文本在这个ASCII规范化的列上search,但是显示原始unicode列的数据。
你需要看这些,而不是作为重音字符,但作为完全不同的字符。 你可能也在寻找a,b或c。 这就是说,我会尝试使用它的正则expression式。 它看起来像这样:
SELECT * from TB_MOVIE WHERE MOVIE_NAME REGEXP '.*[aAàÀ].*' ORDER BY MOVIE_NAME;
您可以使用Android NDK重新编译包含所需ICU(Unicode的国际组件)的SQLite源代码。 用俄语在这里解释: http : //habrahabr.ru/post/122408/
编译与ICU的源代码的过程在这里解释:
如何编译与ICU的SQLite?
不幸的是,你会结束与不同的CPU不同的APK。