如何在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。

要解决这个问题:

  1. 将另一列添加到您的表格,例如MOVIE_NAME_ASCII
  2. 将值存储到删除了重音符号的列中。 您可以通过将您的string标准化为Unicode Normal Form D(NFD)并删除非ASCII代码点来删除重音符号,因为NFD粗略地将重音字符表示为纯ASCII +组合重音标记:

     String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD) .replaceAll("[^\\p{ASCII}]", ""); 
  3. 你的文本在这个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。