查找包含非拉丁字符的联系人时搜索结果无效

Posted

技术标签:

【中文标题】查找包含非拉丁字符的联系人时搜索结果无效【英文标题】:Invalid search results while looking for contacts with non-latin characters 【发布时间】:2013-08-22 19:32:28 【问题描述】:

我是 android 新手,最近遇到了这样的问题:

我正在使用 Android 联系人数据库,特别是数据表。我在那里放了一些新的 mimetype 信息,并试图在搜索过程中寻找这些信息。问题是,我使用的是 SQLite LIKE 运算符,它对非拉丁字符区分大小写。另一个问题是我无法以任何方式更改数据库,因为它是 android 内置数据库。

Builder builder = Data.CONTENT_URI.buildUpon();

loader.setSelection(getIndividualsSelection());
query = query.trim();
if( (null != query) && !query.equals(""))

    loader.setSelection(Data.MIMETYPE + "='" + 
        MY_MIMETYPE + "' " +   " AND  ( " + 
        MY_DATA_COLUMN + 
        " LIKE '"+ query + "%' " +
        specialCharsEscape + "  COLLATE NOCASE)");
    loader.setSelectionArgs(null);        
    loader.setUri(builder.build()); 
    loader.setProjection(MY_PROJECTION);
    loader.setSortOrder(MY_SORT_ORDER);


这都是在 LoaderCallbacks 的 onCreateLoader 函数内部,其中 loader 是 CursorLoader 类型的。你知道如何强制我的 SQLite 不区分大小写吗?

我已经尝试过使用 SQLite 函数 UCASE 和 LCASE 但它不起作用。使用正则表达式会导致该数据库出现异常以及使用 MATCH... 将不胜感激。

【问题讨论】:

【参考方案1】:

Android 有localized collations。

要真正能够使用排序规则进行比较,请使用BETWEEN 而不是LIKE;例如:

MyDataColumn BETWEEN 'mąka' COLLATE UNICODE AND 'mąka?' COLLATE UNICODE

? 是最后一个 UTF-8 编码的 Unicode 字符; Java 字符串可能会将其与代理编码为"\uDBFF\uDFFF"

请注意,UNICODE 排序规则在某些 Android 版本中被破坏。

【讨论】:

如何使用 BETWEEN 比较两个字符串?例如,当我键入 mĄka 时,我希望我的代码在 data1 中找到与 mąka 的联系。 解决方案不起作用。它不返回匹配的不区分大小写的记录,而是什么也不返回。

以上是关于查找包含非拉丁字符的联系人时搜索结果无效的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node 从 MySQL 读取非拉丁字符?

从 Ant tar 任务打包的 .tar.gz 中提取时包含非拉丁字符的文件名的编码

查找包含非 [a-z] 或 [0-9] 字符的标签

Python 搜索字符串包含字符

EBCDIC 到 ASCII 无法正常工作

在 vim 中查找第一个未注释的行而不删除搜索