首页 > 移动开发 > Android下查询系统源码看短信的显示

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

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

在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][/java] view plaincopyprint?

  1. package com.itcode.SMSManager.utils;
  2. import android.net.Uri;
  3. public class SmsUtils {
  4.  public static final Uri SMSURL = Uri.parse("content://sms/conversations");
  5. }

2.

[java][/java] view plaincopyprint?

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

运行结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


本文固定链接: http://www.devba.com/index.php/archives/3251.html | 开发吧

报歉!评论已关闭.