Android下查询系统源码看短信的显示

来源:互联网 发布:windows系统正版验证 编辑:程序博客网 时间:2024/05/16 01:38

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

providers.telephony:SmsProvider:

 

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

Uri = content://sms/conversations

 

 

 

2.确定查询语句: select  映射条目 from 表  where 查询条件

 

 

:

sms, (SELECT thread_id AS group_thread_id, MAX(date)AS group_date,COUNT(*) AS msg_count FROM sms GROUP BY thread_id) AS groups

查询条件:

sms.thread_id = groups.group_thread_id AND sms.date = groups.group_date

映射条目:

sms.body AS snippet 

 sms.thread_id AS thread_id 

 groups.msg_count AS msg_count

 

 

所以查询语句:

 

select 

 sms.body AS snippet,sms.thread_id AS thread_id,groups.msg_count AS msg_count

from 

  sms, (SELECT thread_id AS group_thread_id, MAX(date)AS group_date,COUNT(*) AS msg_count FROM sms GROUP BY thread_id) AS groups

where

 sms.thread_id = groups.group_thread_id AND sms.date = groups.group_date

 

查询结果:

 

 

 

 

还需要号码,日期/时间

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

看系统如何解决:query:

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

 

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

 

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

 

 

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

 

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

 

 

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

 

分析源码:

 

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

select sms.body AS snippet,sms.thread_id AS thread_id,groups.msg_count AS msg_count,sms.address as address,sms.date as date

from  sms, (SELECT thread_id AS group_thread_id, MAX(date)AS group_date,COUNT(*) AS msg_count FROM sms GROUP BY thread_id) AS groups

where sms.thread_id = groups.group_thread_id AND sms.date = groups.group_date

 

 

 

 详细代码:

 

1.

[java] view plaincopyprint?
  1. package com.itcode.SMSManager.utils;  
  2.   
  3. import android.net.Uri;  
  4.   
  5. public class SmsUtils {  
  6.   
  7.  public static final Uri SMSURL = Uri.parse("content://sms/conversations");  
  8. }  


2.

[java] view plaincopyprint?
  1. package com.itcode.SMSManager;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.AsyncQueryHandler;  
  5. import android.content.ContentResolver;  
  6. import android.database.Cursor;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9.   
  10. import com.itcode.SMSManager.utils.SmsUtils;  
  11.   
  12. public class ConversationActivity extends Activity {  
  13.   
  14.     private ConversationAsyncQueryHandler asyncQuery;  
  15.     private static final String[] CONVERSATIONSMSPROJECTION = {  
  16.             "sms.body AS snippet""sms.thread_id AS thread_id",  
  17.             "groups.msg_count AS msg_count""sms.address as address",  
  18.             "sms.date as date" };  
  19.     public static final String TAG = "ConversationActivity";  
  20.   
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         // TODO Auto-generated method stub  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_conversion);  
  26.   
  27.         asyncQuery = new ConversationAsyncQueryHandler(getContentResolver());  
  28.         asyncQuery.startQuery(0null, SmsUtils.SMSURL,  
  29.                 CONVERSATIONSMSPROJECTION, nullnull"date DESC");  
  30.   
  31.     }  
  32.   
  33.     private class ConversationAsyncQueryHandler extends AsyncQueryHandler {  
  34.   
  35.         private String value;  
  36.         private String  columnName;  
  37.   
  38.         public ConversationAsyncQueryHandler(ContentResolver cr) {  
  39.             super(cr);  
  40.             // TODO Auto-generated constructor stub  
  41.         }  
  42.   
  43.         /** 
  44.          * 当异步查询结束后调用的方法 
  45.          * Called when an asynchronous query is completed. 
  46.          * token the token to identify the query, passed in from startQuery. 
  47.          * cookie 添加额外的数据的 the cookie object passed in from startQuery. 
  48.          * cursor 查询出来的结果集The cursor holding the results from the query. 
  49.          */  
  50.         @Override  
  51.         protected void onQueryComplete(int token, Object cookie, Cursor cursor) {  
  52.             // TODO Auto-generated method stub  
  53.             super.onQueryComplete(token, cookie, cursor);  
  54.             if(cursor != null && cursor.getCount()>0){  
  55.                 int columnCount = cursor.getColumnCount();  
  56.                 while(cursor.moveToNext()){  
  57.                     for(int i=0;i<columnCount;i++){  
  58.                         columnName = cursor.getColumnName(i);  
  59.                         value = cursor.getString(i);  
  60.                         Log.i(TAG,"当前是第"+cursor.getPosition() + "行:" + columnName + ":" + value);  
  61.                     }  
  62.                 }  
  63.             }  
  64.         }  
  65.   
  66.     }  
  67. }  


 

运行结果:

 

 

  

 GZ应届大学生IT it菜鸟营