上篇文章《Android Contact分析(一):Data, RawContact, Contact之间的关系》已经把联系人表之间的关系讲明了,这篇文章就写点例子,来加深一下。

一、读取联系人中所有姓名和电话号码:

[java] view plaincopy
  1. /**
  2. * 查询所有联系人姓名及电话号码
  3. */
  4. private void readContacts(){
  5. StringBuilder sb = new StringBuilder();
  6. ContentResolver cr = getContentResolver();
  7. // select * from contacts
  8. Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
  9. null, null, null, null);
  10. while(cursor.moveToNext()){
  11. String id = cursor.getString(
  12. cursor.getColumnIndex(ContactsContract.Contacts._ID));
  13. String name = cursor.getString(
  14. cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  15. int iHasPhoneNum = Integer.parseInt(cursor.getString(
  16. cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
  17. sb.append(name + " (");
  18. if(iHasPhoneNum > 0){
  19. Cursor numCursor = cr.query(
  20. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  21. null,
  22. ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
  23. null, null);
  24. while(numCursor.moveToNext()){
  25. String number = numCursor.getString(
  26. numCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  27. sb.append(number + ")");
  28. }
  29. numCursor.close();
  30. }
  31. sb.append("\r\n");
  32. }
  33. cursor.close();
  34. if(!sb.toString().isEmpty()){
  35. Log.d(TAG, "联系人:\r\n" + sb.toString());
  36. }
  37. }

1. 先从Contact中,查找所有的记录;

2. 读取每条Contact_ID以及姓名;

3. 根据Contact_ID去查询该联系人的所有电话号码。

二、姓名模糊查询:

[java] view plaincopy
  1. /**
  2. * 根据名字中的某一个字进行模糊查询
  3. * @param key
  4. */
  5. private void getFuzzyQueryByName(String key){
  6. StringBuilder sb = new StringBuilder();
  7. ContentResolver cr = getContentResolver();
  8. String[] projection = {ContactsContract.PhoneLookup.DISPLAY_NAME,
  9. ContactsContract.CommonDataKinds.Phone.NUMBER};
  10. Cursor cursor = cr.query(
  11. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  12. projection,
  13. ContactsContract.Contacts.DISPLAY_NAME + " like " + "'%" + key + "%'",
  14. null, null);
  15. while(cursor.moveToNext()){
  16. String name = cursor.getString(
  17. cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  18. String number = cursor.getString(
  19. cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  20. sb.append(name + " (").append(number + ")").append("\r\n");
  21. }
  22. cursor.close();
  23. if(!sb.toString().isEmpty()){
  24. Log.d(TAG, "查询联系人:\r\n" + sb.toString());
  25. }
  26. }

三、电话号码模糊查询:

[java] view plaincopy
  1. /**
  2. * 根据名字中的某一个字进行模糊查询
  3. * @param key
  4. */
  5. private void getFuzzyQueryByName(String key){
  6. StringBuilder sb = new StringBuilder();
  7. ContentResolver cr = getContentResolver();
  8. String[] projection = {ContactsContract.PhoneLookup.DISPLAY_NAME,
  9. ContactsContract.CommonDataKinds.Phone.NUMBER};
  10. Cursor cursor = cr.query(
  11. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  12. projection,
  13. ContactsContract.Contacts.DISPLAY_NAME + " like " + "'%" + key + "%'",
  14. null, null);
  15. while(cursor.moveToNext()){
  16. String name = cursor.getString(
  17. cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  18. String number = cursor.getString(
  19. cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  20. sb.append(name + " (").append(number + ")").append("\r\n");
  21. }
  22. cursor.close();
  23. if(!sb.toString().isEmpty()){
  24. Log.d(TAG, "查询联系人:\r\n" + sb.toString());
  25. }
  26. }

四、通过汉字返回拼音:

[java] view plaincopy
  1. private void getPinyinByHanzi(String name){
  2. ContentValues values = new ContentValues();
  3. ContentResolver cr = getContentResolver();
  4. Uri rawContactUri = cr.insert(
  5. ContactsContract.RawContacts.CONTENT_URI, values);
  6. long rawContactId = ContentUris.parseId(rawContactUri);
  7. if(name.length() > 0){
  8. values.clear();
  9. values.put(Data.RAW_CONTACT_ID, rawContactId);
  10. values.put(Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
  11. values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
  12. cr.insert(ContactsContract.Data.CONTENT_URI, values);
  13. String[] projection = {"sort_key"};
  14. String where = ContactsContract.RawContacts.CONTACT_ID + "=" + rawContactId;
  15. Cursor cursor = cr.query(ContactsContract.RawContacts.CONTENT_URI, projection, where, null, null);
  16. if(cursor != null){
  17. cursor.moveToFirst();
  18. String pinyin = cursor.getString(cursor.getColumnIndex("sort_key"));
  19. Log.d(TAG, pinyin);
  20. String res = "";
  21. for(int i = 0; i < pinyin.length(); i ++){
  22. String temp = pinyin.substring(i, i+1);
  23. if(temp.matches("[a-zA-Z ]")){
  24. res += temp;
  25. }
  26. }
  27. res = res.substring(0, res.length()-1);
  28. Log.d(TAG, name + " translate = \"" + res.toLowerCase(Locale.getDefault()) + "\"");
  29. }
  30. }
  31. cr.delete(ContentUris.withAppendedId(
  32. ContactsContract.RawContacts.CONTENT_URI, rawContactId),
  33. null, null);
  34. }

这段代码,是利用了RawContact中,有个"sort_key"的字段,这个字段的内容将会是拼音+汉字,如:输入“联系人”,"sort_key"中的内容是“LIAN联 XI系 REN人 ”。

思想如下:

1. 在RawContact中,添加一行,则会返回一个RawContact URI,根据这个URI,可以得到Raw Contact ID;

2. 根据Raw Contact ID,向Data中的,添加名字;

3. 根据Raw Contact ID,查询RawContact表,取出"sort_key"字段;

4. 根据Raw Contact ID,删除这条记录,则在Contact, Data中都会自动删除。

Android Contact分析(二):实战篇之读取联系人,模糊查询,通过汉字返回拼音相关推荐

  1. Android 系统(174)---Android代码分析lint检查篇

    Android代码分析lint检查篇 1.什么是lint检查?   Android lint检查是一个静态代码分析工具,它能够对你的Android项目中潜在的bug,可优化的代码,安全性,性能,可用性 ...

  2. C# Xamarin For Android移动开发项目实战篇

    一.课程介绍 在前面阿笨的<C# Xamarin移动开发基础进修篇>课程中,大家已经熟悉和了解了Xamarin移动App开发的基础知识和原理.本次分享课<C# Xamarin移动开发 ...

  3. docker android模拟器,「docker实战篇」python的docker-创建appium容器以及设置appium容器连接安卓模拟器(31)...

    上一节已经下载好了appium的镜像,接下来说下如何创建appium如何创建容器和模拟器如何连接appium容器.源码:https://github.com/limingios/dockerpytho ...

  4. Android Telephony分析(二) ---- RegistrantList详解

    前言 本文主要讲解RegistrantList的原理,以及如何快速分析RegistrantList相关的代码流程.  在Telephony模块中,在RIL.Tracker(ServiceStateTr ...

  5. es 仅返回单个字段 查询_ES性能优化实战,几十亿数据查询 3 秒返回!

    来源:cnblogs.com/mikevictor07/p/10006553.html 在此篇幅中偏重于 ES 的优化,关于 HBase,Hadoop 的设计优化有很多文章可以参考,不再赘述. 需求说 ...

  6. Android Native Crash崩溃及错误原因分析二-实战解决

    一. 简述 之前有一篇文章讲诉了Android实际开发过程中一些崩溃的原因,以及对崩溃类型做了详细的介绍,简单回顾一下:Crash类型:Java和Native,JavaCrash中明显会打印出Andr ...

  7. android apr分析,APR分析信号篇

    APR分析-信号篇 U know信号是Unix的重要系统机制.信号机制使用起来很简单,但是理解起来有并不是那么Easy.APR Signal的封装也并不繁琐,代码量很少,所以分析APR Signal的 ...

  8. Android WifiDisplay分析二:Wifi display连接过程

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] WifiDisplay之P2P的建立 WifiDisplay之RTSP server的创建 这一章中我们来看Wifi Displ ...

  9. android6.0原生brower_android原生browser分析(二)--界面篇

    我们先看一张浏览器的主界面,上面标示浏览器界面各部分对应的类,这里是以平板上的界面为例.给张图是为了给大家一个直观的感觉. BrowserActivity是整个应用的主界面,在onCreate中创建了 ...

  10. LabVIEW感兴趣区域分析(实战篇—1)

    目录 1.ROI定义及实现方法 2.基础案例:图像感兴趣区域手动标记 3.进阶案例:图像颗粒自动标记 ROI(region of interest),感兴趣区域.机器视觉.图像处理中,从被处理的图像以 ...

最新文章

  1. C++ 虚函数个人理解
  2. 微信基础服务肯定不收费
  3. formatnumber js_javascript js format number 数字格式化
  4. request.setCharacterEncoding(utf-8);
  5. 微型计算机应用领域及应用,自考“微型计算机应用基础”自考大纲(1)
  6. heapdump分析工具_.NET Perfview 分析进程性能
  7. html开发列表搜索,前端实例练习 - 可搜索列表
  8. (一)数字图像处理基础知识点
  9. 收集45个实用的免费LOGO在线制作网站
  10. 计算机无法进去系统,电脑开机后进不了系统的解决方法步骤图
  11. 开源软件 介绍及地址
  12. JS中Object.entries()方法
  13. python//Jan.17th,2020//类
  14. 有三个数abc 要求按大小顺序把它们输出_认识数字、比大小、凑十法… 孩子们做做手工玩玩游戏就OK了...
  15. 阿里巴巴 DevOps 转型后的运维平台建设
  16. 今天遇到的坑--this.$emit
  17. ScreenCapture:通过DirectX 库进行屏幕捕获
  18. 大厂架构师之路8. 创业 - 做销售
  19. oa办公系统和网络安全相关问题分析
  20. 欢迎试用Android定时达人~

热门文章

  1. 怎样将计算机和电视机连接网络,家里怎么连接网络到电视机,让电脑和电视都可以上网。...
  2. 使用QGIS实现城市空气质量指数(AQI)数据可视化
  3. 替换WIN键和Ctrl键
  4. 沧海云帆服务器哪里的,天涯明月刀沧海云帆9月合服_天刀沧海云帆大区9月合服公告_3DM网游...
  5. 小菜学前端day02(学习笔记)
  6. 染色基础知识(四)——怎么染?
  7. 华为android贡献度,米粉别不信,华为对安卓系统的贡献比小米更多
  8. 多元逻辑回归(Multinomial Logistic Regression)
  9. 供应链管理的终极目标
  10. 8.字典操作。建立一个月份与天数的字典monthdays,月份为“Jan”“Feb”“Mar”“Apr”“May”“Jun” “Jul” “Aug” “Sep” “Oct” “Nov“ “Dec“