最近在作一个拨打网络电话的应用,光数据库设计这一块就头疼了好久,须要建立独立的数据库,而不是直接使用手机联系人数据库。既然独立建立,那就须要模拟一份手机联系人的数据库信息。java
应用设计到电话接打,信息收发,联系人列表,通话记录,信息统计这样的一些业务。因此以为这个数据设计应该不是很简单。不过有多不简单就不说了。如今须要解决一个现实问题:联系人列表有索引值,联系人按拼音首字母归类显示,并能经过首字母很快查找到,简单的说就是跟“手机联系人”的应用是同样的效果。因为是自建数据库,因此这个索引须要本身作,由于在添加联系人的时候必须有索引值。数据库
所谓拼音首字母索引,就是用户名是名字的拼音的对应关系,好比:张三------->zs。或者:张三------>zhangsan网络
其实只要把汉字转换成拼音了,问题就简单了。就这问题,我在网上找了一个大侠的贴,以为很不错,就拿来了。原帖地址:http://www.oschina.net/code/snippet_203635_11850。app
主要难题已被这位大神解决了,我就在这里班门弄斧一下。数据库设计
就个人问题而言,把新增的联系人制做一个首字母索引,就只要用到文中的三个方法:spa
public static String getSpells(String characters){ StringBuffer buffer = new StringBuffer(); for(int i=0;i<characters.length();i++){ char ch = characters.charAt(i); if((ch>>7)==0){ //判断是否为汉字,若是左移7为为0就不是汉字,不然是汉字
return characters;//这句是我本身加的,若是不是汉字,那就返回原字符串,应该没问题吧! }else{ char spell = getFirstLetter(ch); buffer.append(String.valueOf(spell)); } } return buffer.toString(); } // 获取一个汉字的首字母 public static Character getFirstLetter(char ch) { byte[] uniCode = null; try { uniCode = String.valueOf(ch).getBytes("GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } if (uniCode[0] < 128 && uniCode[0] > 0) { // 非汉字 return null; } else { return convert(uniCode); } } /** * 获取一个汉字的拼音首字母。 GB码两个字节分别减去160,转换成10进制码组合就能够获得区位码 * 例如汉字“你”的GB码是0xC4/0xE3,分别减去0xA0(160)就是0x24/0x43 * 0x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为‘n’ */ static char convert(byte[] bytes) { char result = '-'; int secPosValue = 0; int i; for (i = 0; i < bytes.length; i++) { bytes[i] -= GB_SP_DIFF; } secPosValue = bytes[0] * 100 + bytes[1]; for (i = 0; i < 23; i++) { if (secPosValue >= secPosValueList[i] && secPosValue < secPosValueList[i + 1]) { result = firstLetter[i]; break; } } return result; }咱们新增联系人时,只须要 sortKey = getSpells(“联系人名字”),把sortKey本身处理一下就能够插入本身的联系人数据库中了,取出来是绝对没错的。