Android - SimpleAdapter过滤查询,如何忽略重音?

时间:2011-12-06 12:55:26

标签: android filter cursor android-contentprovider

我目前正在使用ContentProvider联系人从设备中检索联系人,并允许用户通过键入EditText来过滤结果。

为此,我在SimpleAdapter上设置了一个过滤查询,如下所示:

    contactsAdapter.setFilterQueryProvider(new FilterQueryProvider() {
        String[] PROJECTION = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.HAS_PHONE_NUMBER,
        };
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED COLLATE NOCASE ASC";

          public Cursor runQuery(CharSequence constraint) {
            String SELECTION = "LOWER(" + ContactsContract.Contacts.DISPLAY_NAME + ")" 
            + " LIKE '" + constraint + "%' " + "and " + ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
            Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI, 
                    PROJECTION, SELECTION, null, sortOrder);
            return cur; 
          }
        });
    setListAdapter(contactsAdapter); 

这在大多数情况下有效但是当我有重音的联系人时(例如:TéstCóntact),我希望即使用户输入测试联系人,联系人也会显示,但目前它没有。

在这种情况下也不会忽略这种情况,对于标准字符,例如,如果我有一个名为Omar的联系人,并且搜索omar匹配但是如果我有一个名为Ómar的联系人并且搜索ómar它没有'匹配。

有谁知道我应该做些什么来实现我想要实现的行为?

3 个答案:

答案 0 :(得分:0)

请参阅我的问题Using COLLATE in Android SQLite - Locales is ignored in LIKE statement

简短回答 - 我认为在Android SQLite中使用LIKE语句并忽略重音是不可能的。我通过在数据库中创建一个新列来解决它,在该列中存储没有重音符号的相同名称,小写。例如,第1列存储“TéstCóntact” - 用于显示,第2列存储“测试联系人” - 用于使用LIKE语句。 Android 2.3有一个Normalizer类,它将删除字符串中的所有重音符号。如果您支持较低的Android API,那么您可能需要以某种方式编写自己的规范化器...

答案 1 :(得分:0)

我会在这里看到两个选项:

  • 创建一个表,其中包含联系人姓名的无重音版本以及对实际联系人ID的引用
  • 将重音字符替换为?在你的搜索中(这可能导致用户没有预期的行为,但是更简单)

答案 2 :(得分:0)

您可以使用替换功能删除重音字符。看看这个简单的解决方案:

How to SQL compare columns when one has accented chars?