Android T9搜索联系人(智能拨号器)

时间:2016-11-07 03:16:39

标签: android android-contacts contactscontract

我想实现T9搜索,如android native dialer或TrueCaller dialer。到目前为止我所取得的成就是: -

将键击转换为字符串模式,就像我在拨号器上按2一样,它会给我 - “abc”“ac”“ca”等等

现在我提出了一个问题

String selection = Utility.getSelectionLikeWithIn(mmemonics);

Cursor query = getContentResolver()。query(ContactsContract.Contacts.CONTENT_URI,null,selection,null,null);'

public static String getSelectionLikeWithIn(List mmemonics){

    String selection = "";
    for (int i = 0; i < mmemonics.size(); i++) {
        selection = selection + " display_name LIKE '";
        selection = selection + mmemonics.get(i);

        if (i == mmemonics.size() - 1){
            selection = selection + "%'";


        }else {
            selection = selection + "%' OR";
        }
    }
    return selection;
}'

上面的方法将字符串的Arraylist转换为where子句

其中display_name类似'ab%'或display_name LIKE'abc%'等......

这样,由于复杂的查询,这给我带来了低效的结果和应用程序崩溃......

请建议我如何在ContactsProvider中执行查询以匹配我的击键或其他任何方式来执行此类智能搜索

1 个答案:

答案 0 :(得分:5)

如果您要刷新每个数字的列表,这种技术将无效,因为它太慢了。

更好的选择是从Contacts数据库中读取所有联系人姓名,并将其存储在简单的ArrayList<String>或类似的集合中,最好在读取名称转换时他们toLowerCase()可以在下一步中更轻松地进行搜索。

接下来,对于每个按下的数字,从输入的数字中构建regular expression pattern,例如“234”将转换为模式.*[abc][def][ghi].*

构建模式后,遍历名称列表并返回与模式匹配的名称。