我想实现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中执行查询以匹配我的击键或其他任何方式来执行此类智能搜索
答案 0 :(得分:5)
如果您要刷新每个数字的列表,这种技术将无效,因为它太慢了。
更好的选择是从Contacts
数据库中读取所有联系人姓名,并将其存储在简单的ArrayList<String>
或类似的集合中,最好在读取名称转换时他们toLowerCase()
可以在下一步中更轻松地进行搜索。
接下来,对于每个按下的数字,从输入的数字中构建regular expression pattern,例如“234”将转换为模式.*[abc][def][ghi].*
构建模式后,遍历名称列表并返回与模式匹配的名称。