上周拿到小米。最近一周在尝试开发通迅薄。一方面是系统自带的通迅薄的确有些不爽的地,一方面也是想尝试写一些手机应用。
中间碰到两个问题,估计其它人也会碰到,就一并写下。
1 效率太慢。
网上有大量的帖子(如http://blog.csdn.net/yao_guet/article/details/6626001),先要去查所有联系人(有些人根本没有电话),接着去查电话纪录(一个人可能有多个电的话)。如果你的联系很多,比如像我有600多个联系人,那打开通迅薄差不多要3秒以上(小米的硬件还是很强悍的)。问题的关键就这在两个while上。
其实只需要直接查询ContactsContract.CommonDataKinds.Phone.CONTENT_URI就可以拿到DisplayName和PhoneNumber。我想内部很可能只查了一个表就搞定了。
另外,我的应用只需要手机,所以加上以下条件
StringBuffer selection = new StringBuffer()
.append(pn + " NOT LIKE '106%'")
.append(" and substr("+pn+",0,3) != '106'")
.append(" and "+pn + " NOT LIKE '010%'")
.append(" and length("+pn + ") >= 11")
.append(" and ("+pn + " LIKE '1%' or "+pn + " LIKE '01%')");
基本上够我用了。
针对查询速度问题,有熟手自己写AyncQueryHandler。我这种菜鸟没敢尝试。
2 通迅薄拼音排序
网上的例子大部份都是
sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
本来以为Sqlite和SQL server差不多应该能换那个LOCALIZED,结果都不行。
其实一句话就能搞定
sortOrder = "sort_key_alt";
我想可能在表中有个字段就叫sort_key_alt。
二个问题都很常见,网上也有很多人问,不过正确答案确不多。另外,Android的API也的确比较乱点,中文资料也很少(个人观点)。