查询系统源码看短信的显示如何写:

providers.telephony:SmsProvider:

1.确定怎么查数据库中的表:

Uri=content://sms/conversations

2.确定查询语句:select映射条目fromwhere查询条件

:

sms,(SELECTthread_idASgroup_thread_id,MAX(date)ASgroup_date,COUNT(*)ASmsg_countFROMsmsGROUPBYthread_id)ASgroups

查询条件:

sms.thread_id=groups.group_thread_idANDsms.date=groups.group_date

映射条目:

sms.bodyASsnippet

sms.thread_idASthread_id

groups.msg_countASmsg_count

所以查询语句:

select

sms.bodyASsnippet,sms.thread_idASthread_id,groups.msg_countASmsg_count

from

sms,(SELECTthread_idASgroup_thread_id,MAX(date)ASgroup_date,COUNT(*)ASmsg_countFROMsmsGROUPBYthread_id)ASgroups

where

sms.thread_id=groups.group_thread_idANDsms.date=groups.group_date

查询结果:

还需要号码,日期/时间

但看系统源码的映射列都已经写死,用户若添加自己需要的列会将系统的列覆盖:

看系统如何解决:query:

这里的query是用户来调用的,所以projectionIn是用户传进来的,

继续找:同一个方法内,query怎么处理projictionIn,

点击查看如何处理用户传进来的projectionIn,

再次点击发现进不去,为本类的方法:查找:

第一个在判断里面,略去不看,看第二个:projection等各种参数建立成为一个sql语句,点击,发现进不去,,buildQuery为一个本类方法:查找其实现:

点击发现是一个本类方法,查找其实现:

分析源码:

将需要添加的列写好,测试正确性:

selectsms.bodyASsnippet,sms.thread_idASthread_id,groups.msg_countASmsg_count,sms.addressasaddress,sms.dateasdate

fromsms,(SELECTthread_idASgroup_thread_id,MAX(date)ASgroup_date,COUNT(*)ASmsg_countFROMsmsGROUPBYthread_id)ASgroups

wheresms.thread_id=groups.group_thread_idANDsms.date=groups.group_date

详细代码:

1.

[java] view plain copy print ?
  1. packagecom.itcode.SMSManager.utils;
  2. importandroid.net.Uri;
  3. publicclassSmsUtils{
  4. publicstaticfinalUriSMSURL=Uri.parse("content://sms/conversations");
  5. }


2.

[java] view plain copy print ?
  1. packagecom.itcode.SMSManager;
  2. importandroid.app.Activity;
  3. importandroid.content.AsyncQueryHandler;
  4. importandroid.content.ContentResolver;
  5. importandroid.database.Cursor;
  6. importandroid.os.Bundle;
  7. importandroid.util.Log;
  8. importcom.itcode.SMSManager.utils.SmsUtils;
  9. publicclassConversationActivityextendsActivity{
  10. privateConversationAsyncQueryHandlerasyncQuery;
  11. privatestaticfinalString[]CONVERSATIONSMSPROJECTION={
  12. "sms.bodyASsnippet","sms.thread_idASthread_id",
  13. "groups.msg_countASmsg_count","sms.addressasaddress",
  14. "sms.dateasdate"};
  15. publicstaticfinalStringTAG="ConversationActivity";
  16. @Override
  17. protectedvoidonCreate(BundlesavedInstanceState){
  18. //TODOAuto-generatedmethodstub
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_conversion);
  21. asyncQuery=newConversationAsyncQueryHandler(getContentResolver());
  22. asyncQuery.startQuery(0,null,SmsUtils.SMSURL,
  23. CONVERSATIONSMSPROJECTION,null,null,"dateDESC");
  24. }
  25. privateclassConversationAsyncQueryHandlerextendsAsyncQueryHandler{
  26. privateStringvalue;
  27. privateStringcolumnName;
  28. publicConversationAsyncQueryHandler(ContentResolvercr){
  29. super(cr);
  30. //TODOAuto-generatedconstructorstub
  31. }
  32. /**
  33. *当异步查询结束后调用的方法
  34. *Calledwhenanasynchronousqueryiscompleted.
  35. *tokenthetokentoidentifythequery,passedinfromstartQuery.
  36. *cookie添加额外的数据的thecookieobjectpassedinfromstartQuery.
  37. *cursor查询出来的结果集Thecursorholdingtheresultsfromthequery.
  38. */
  39. @Override
  40. protectedvoidonQueryComplete(inttoken,Objectcookie,Cursorcursor){
  41. //TODOAuto-generatedmethodstub
  42. super.onQueryComplete(token,cookie,cursor);
  43. if(cursor!=null&&cursor.getCount()>0){
  44. intcolumnCount=cursor.getColumnCount();
  45. while(cursor.moveToNext()){
  46. for(inti=0;i<columnCount;i++){
  47. columnName=cursor.getColumnName(i);
  48. value=cursor.getString(i);
  49. Log.i(TAG,"当前是第"+cursor.getPosition()+"行:"+columnName+":"+value);
  50. }
  51. }
  52. }
  53. }
  54. }
  55. }


运行结果:

更多相关文章

  1. android java 层参数重载glVertexAttribPointer 在es20 C 接口中
  2. 【Android】(已更新解决方案)更新SDK版本(25)后,自定义FloatingAction
  3. Android按返回键(后退键)Back键事件捕获的两种方法
  4. Android出现Attempt to invoke virtual method... on a null obj
  5. 打开Android(安卓)C文件中的LOG
  6. android图形图像函数汇集
  7. Android(安卓)Service的两种启动方式,你知道吗?
  8. android软键盘不覆盖屏幕方法
  9. Android游戏引擎《Rokon》:主要类和方法的介绍文档

随机推荐

  1. Android相对布局属性全集
  2. Android(安卓)RelativeLayout(相对布局)
  3. Android(安卓)页面布局属性全
  4. Android(安卓)SDK 国内镜像
  5. Android菜鸟日记7
  6. ListView详解
  7. what is Android?
  8. 【30篇突击 android】源码统计一
  9. Could not GET 'https://dl.google.com/d
  10. Android(安卓)RelativeLayout中layout_ma