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

Android-SimpleAdapter过滤器查询,如何忽略重音?,android,filter,cursor,android-contentprovider,Android,Filter,Cursor,Android Contentprovider,我目前正在使用ContentProvider for contacts从设备中检索联系人,并允许用户通过键入EditText来过滤结果 为此,我在SimpleAdapter上设置了一个过滤器查询,如下所示: contactsAdapter.setFilterQueryProvider(new FilterQueryProvider() { String[] PROJECTION = new String[] { ContactsContra

我目前正在使用ContentProvider for contacts从设备中检索联系人,并允许用户通过键入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ést Cócontact)时,我希望该联系人显示出来,即使用户在测试联系人中键入,但目前没有

此外,在本例中也不会忽略大小写,而对于标准字符,则会忽略大小写,例如,如果我有一个名为Omar的联系人并搜索Omar,则大小写匹配,但如果我有一个名为Ómar的联系人并搜索ómar,则大小写不匹配

有人知道我应该做什么来实现我想要实现的行为吗

见我的问题

简短回答-我认为在Android SQLite中使用LIKE语句而忽略重音是不可能的。我通过在数据库中创建一个新列解决了这个问题,在该列中,您可以存储相同的名称,而不使用重音符号和小写字母。例如,第1列存储“Tést Cócontact”-用于显示,第2列存储“test contact”-用于使用LIKE语句。 Android2.3有一个规范化器类,可以删除字符串中的所有重音。如果您支持较低的Android API,那么您可能需要以某种方式编写自己的规范化程序…

请参见我的问题

简短回答-我认为在Android SQLite中使用LIKE语句而忽略重音是不可能的。我通过在数据库中创建一个新列解决了这个问题,在该列中,您可以存储相同的名称,而不使用重音符号和小写字母。例如,第1列存储“Tést Cócontact”-用于显示,第2列存储“test contact”-用于使用LIKE语句。
Android2.3有一个规范化器类,可以删除字符串中的所有重音。如果您支持较低的Android API,那么您可能需要以某种方式编写自己的规范化程序…

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

  • 创建一个表,其中包含联系人名称的无重音版本和对实际联系人Id的引用
  • 将重音字符替换为?在您的搜索中(这可能会导致用户预期的行为,但要简单得多)

我在这里看到两个选项:

  • 创建一个表,其中包含联系人名称的无重音版本和对实际联系人Id的引用
  • 将重音字符替换为?在您的搜索中(这可能会导致用户预期的行为,但要简单得多)

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


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


当涉及口音时,案例变得复杂。我很可能会接受的案例,忽略口音/发音更重要。当涉及口音时,案例变得复杂。我很可能会接受的案例,忽略重音/变音符号更为重要。您建议如何向android Contacts contentprovider添加一列?我使用的是Contacts contentprovider,而不是我自己的数据库,因此我猜这不是一个选项,除非我放弃当前代码并实现我自己的数据库?哦,对不起,我没有注意到你问题中的ContentProvider部分。我不知道这个问题的最佳解决方案。在上有一个bug报告,评论2中的用户提到LIKE语句可以正确使用Android 2.3中的重音符号,这也可能是他们在Android 2.3中添加Normalizer类的原因…您建议如何向Android Contacts contentprovider添加一个列?不过我使用的是Contacts contentprovider,不是我自己的数据库,所以我猜这不是一个选项,除非我放弃我当前的代码并实现我自己的数据库?哦,对不起,我没有注意到你问题中的ContentProvider部分。我不知道这个问题的最佳解决方案。在上有一个bug报告,评论2中的用户提到LIKE语句可以正确使用Android 2.3的口音,这也可能是他们在Android 2.3中添加Normalizer类的原因…在我的情况下,这两个都不起作用,因为我正在从Contacts内容提供商提取数据。实际上,这两个都可以。我将“?”与单个通配符“”合并。您只需将搜索字段中的所有加重字符替换为“”,但它将比您希望的匹配更多。您还可以创建一个镜像实际联系人表的表。这意味着要保持良好的同步需要一些复杂性,但可以使用ContentObservers完成。在我从联系人内容提供商提取数据时,这两种方法都可以。我将“?”与单个通配符“”合并。您只需将搜索字段中的所有加重字符替换为“”,但它将比您希望的匹配更多。您还可以创建一个镜像实际联系人表的表。这意味着要保持良好的同步需要一些复杂性,但可以通过ContentObservators来实现