3

我目前正在尝试在联系人数据库上运行搜索,并且我传入的值与联系人中的显示名称匹配,我想返回一个带有匹配联系人数量的光标。

目前,除了国际字符外,这工作正常,这是我的代码当前的外观,约束是从 EditText 获取的 CharSequence:

String[] PROJECTION = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.HAS_PHONE_NUMBER,
        };

String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

public Cursor runQuery(CharSequence constraint) {

        String SELECTION = "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ")" 
            + " LIKE UPPER('%" + constraint+ "%') " + "and " + ContactsContract.Contacts.DISPLAY_NAME + " IS NOT NULL"
         + " AND " + ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
            Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
                    PROJECTION, SELECTION, null, sortOrder);

    return cur; 
}

正如我所说,这很好用,因为我希望搜索不区分大小写,因此用户不必输入确切的名称,使用正常的英文名称可以正常工作,但是一旦引入国际字符,搜索就会区分大小写。

我做了一些研究,表明 sqlite 需要一个 ICU 插件才能完成 Android 中缺少的这项工作。或者在插入数据库时​​使用排序规则。但是,由于我只从联系人内容提供者那里阅读,这对我来说不是一个选择。

有谁知道在不区分大小写的情况下在上面的代码中进行搜索以使用国际字符的方法?

4

0 回答 0