【问题标题】:Android sqlite query names with diacritics带有变音符号的 Android sqlite 查询名称
【发布时间】:2013-10-21 15:53:13
【问题描述】:

我有以下问题: 我尝试从数据库中查询包含变音符号的名称。

选择是:

String like = "ë";
String selection = "LOWER(name) LIKE \"%" + like + "%\"";

问题是即使我有包含“Ë”的行,查询也是空的。有任何想法吗? 而且我不想为标准化名称建立一个单独的列。

【问题讨论】:

  • 由于没有适当的 unicode 排序规则序列,我知道的最佳解决方案是您不想要的“规范化名称的单独列”。 stackoverflow.com/questions/16282083/…
  • 好吧,问题是名字来自联系人数据库,因此我必须建立另一个本地数据库,该数据库总是与手机上的联系人数据库同步,并在那里规范化名称,因此添加了很多我的应用程序的复杂性和大小。这就是为什么我希望有一个干净的解决方案。但如果没有干净的内置解决方案,我可能不得不坚持你的想法。

标签: android sqlite


【解决方案1】:

来自SQLite DOC :-

(一个错误:默认情况下,SQLite 只理解 ASCII 字符的大写/小写。默认情况下,LIKE 运算符对超出 ASCII 范围的 unicode 字符区分大小写。例如,表达式 ' a' LIKE 'A' 是 TRUE,但 'æ' LIKE 'Æ' 是 FALSE。)


因此,您应该在使用 like 之前替换变音符号。 Remove diacritics from string in Java 这样做很好。或者使用小写字母,区分大小写。

【讨论】:

  • 不,不工作。选择还可以,喜欢像“erwin”“john”这样的工作,只有当我有变音符号时它才起作用。我有一个名字Ënt,当喜欢是“Ënt”时它不起作用。
  • 奇怪的是,我删除了“LOWER”子句,当我输入 Ë 现在我得到了结果。现在的问题是,如果我输入 ë 小写,它就不起作用
  • 是的,这是真的,我之前读过这就是为什么我在喜欢之前尝试使用“LOWER”。但我看到“LOWER”不起作用。
  • 默认的内置 lower() 函数仅适用于 ASCII 字符。要对非 ASCII 字符进行大小写转换,请加载 ICU 扩展。
  • 啊,明白了。但这是一个内置的联系人数据库。这意味着我无法加载 ICU 扩展程序?
【解决方案2】:

试试这个

字符串选择 = "LOWER(name) LIKE \"'%" + like + "%'\"";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2020-12-16
    • 1970-01-01
    • 2021-01-10
    • 2012-09-19
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多