短信数据库分析(一)

短信数据库分析----provider简介
1、引言
     在前面关于短信的界面更新这一讲已经大致的介绍了短信数据的一个情况,没有关注的同学请看http://blog.csdn.net/ceko_wu/article/details/7724408
本文了主要详细描述短信数据各表的创建以及作用,另外各表之间的关系也是本文关注的。

2、短信数据库

2.1 涉及的源码

/packages/providers/TelephonyProvider/src/com/android/providers/telephony/CdmaCallOptionProvider.java
/packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsProvider.java
/packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
/packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsProvider.java
/packages/providers/TelephonyProvider/src/com/android/providers/telephony/SmsProvider.java
/packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java

2.2  数据库概况


      

说明:上图是短信数据库所有表,这些表被不同的provider调用

3、 provider的大致分类

      首先是短彩信各种表的创建,这些表的创建都是由MmsSmsDatabaseHelper类来完成的,下面请看该类的oncreate方法
    @Override
    public void onCreate(SQLiteDatabase db) {
        createMmsTables(db);
        createSmsTables(db);
        createCommonTables(db);
        createCommonTriggers(db);
        createMmsTriggers(db);
        createWordsTables(db);
        createIndices(db);
    }
这里大家可以很清楚的看到不管你是彩信还是短信都在这统一创建,那下面的话讲会一一来讲解短信彩信还是公共的表的一些作用,在这还可以很清楚的看到短信和彩信相关的表,因为在这将各种表进行分类,短信相关表的创建肯定是调用createSmsTables,彩信相关的肯定是调用createMmsTbales方法。

3.1  sms provider

3.1.1 表的创建

从上面的描述可以看出短信相关的表通过createSmsTables方法来创建的,那短信provider操作的是短信的相关的表,那短信到底有哪些表了,请看createSmsTables方法
private void createSmsTables(SQLiteDatabase db) {
        // N.B.: Whenever the columns here are changed, the columns in
        // {@ref MmsSmsProvider} must be changed to match.
        db.execSQL("CREATE TABLE sms (" +
                   "_id INTEGER PRIMARY KEY," +
                   "thread_id INTEGER," +
                   "address TEXT," +
                   "person INTEGER," +
                   "date INTEGER," +
                   "protocol INTEGER," +
                   "read INTEGER DEFAULT 0," +
                   "status INTEGER DEFAULT -1," + // a TP-Status value // or -1 if it// status hasn't// been received
                   "type INTEGER," +
                   "reply_path_present INTEGER," +
                   "subject TEXT," +
                   "body TEXT," +
                   "service_center TEXT," +
                   "locked INTEGER DEFAULT 0," +
                   "sub_id INTEGER DEFAULT 0," +   // sub_id : 0 for subscription 1// sub_id : 1 for subscription 2
                   "error_code INTEGER DEFAULT 0," +
                   "seen INTEGER DEFAULT 0" +
                   ");");
        /**
         * This table is used by the SMS dispatcher to hold
         * incomplete partial messages until all the parts arrive.
         */
        db.execSQL("CREATE TABLE raw (" +
                   "_id INTEGER PRIMARY KEY," +
                   "date INTEGER," +
                   "reference_number INTEGER," + // one per full message
                   "count INTEGER," + // the number of parts
                   "sequence INTEGER," + // the part number of this message
                   "destination_port INTEGER," +
                   "address TEXT," +
                   "pdu TEXT);"); // the raw PDU for this part
        db.execSQL("CREATE TABLE attachments (" +
                   "sms_id INTEGER," +
                   "content_url TEXT," +
                   "offset INTEGER);");
        /**
         * This table is used by the SMS dispatcher to hold pending
         * delivery status report intents.
         */
        db.execSQL("CREATE TABLE sr_pending (" +
                   "reference_number INTEGER," +
                   "action TEXT," +
                   "data TEXT);");
    }
大家可以看到短信相关的4张表:sms、raw、attachments、sr_pending

3.1.2 功能描述

       raw                                          用于存储接收中的长短信或分段彩信通知
       sr_pending                          用于存储发送报告
       attachments                        该表主要存储接收到的彩信时的彩信附件链接地址
       sms                                        该表非常重要,短信的大部分内容都存储在该表中,所以该表非常重要

3.1.3 sms表的介绍

列名

类型

说明

_id

integer

唯一标识,自增,从1开始

thread_id 

integer

threads表的id

address

text

接收者手机号码,对于一个会话,有可能含有多个接收者,每个人都将收到一条短信

person

integer

联系人(模块)列表里的序号,陌生人为null

date

integer

时间,以豪秒来表示

protocol

integer

协议,分为:0-SMS_RPOTO,1-MMS_PROTO。成功发送后设置。

read

integer

是否阅读:0-未读,1-已读 

status

integer

状态:-1默认值,0-complete,64-pending,128-failed

type

integer

ALL=0;INBOX=1;SENT=2;DRAFT=3;OUTBOX=4;FAILED=5;QUEUED=6;

reply_path_present

integer

TP-Reply-Path位的值 0/1

subject

text

短信的主题,默认为空

body 

text

短信内容

service_center

text

短信服务中心号码编号

locked

integer

此条短信是否已由用户锁定,0-未锁定,1-已锁定

error_code

integer

错误代码,有哪些值暂时未知

seen

integer

用于指明该消息是否已被用户看到(非阅读,点开会话列表即可,不用打开会话),仅对收到的消息有用

这基本上就是这个表的大致内容

3.2 mms provider

3.2.1 创建


private void createMmsTables(SQLiteDatabase db) {
        // N.B.: Whenever the columns here are changed, the columns in
        // {@ref MmsSmsProvider} must be changed to match.
        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PDU + " (" +
                   Mms._ID + " INTEGER PRIMARY KEY," +
                   Mms.THREAD_ID + " INTEGER," +
                   Mms.DATE + " INTEGER," +
                   Mms.MESSAGE_BOX + " INTEGER," +
                   Mms.READ + " INTEGER DEFAULT 0," +
                   Mms.MESSAGE_ID + " TEXT," +
                   Mms.SUBJECT + " TEXT," +
                   Mms.SUBJECT_CHARSET + " INTEGER," +
                   Mms.CONTENT_TYPE + " TEXT," +
                   Mms.CONTENT_LOCATION + " TEXT," +
                   Mms.EXPIRY + " INTEGER," +
                   Mms.MESSAGE_CLASS + " TEXT," +
                   Mms.MESSAGE_TYPE + " INTEGER," +
                   Mms.MMS_VERSION + " INTEGER," +
                   Mms.MESSAGE_SIZE + " INTEGER," +
                   Mms.PRIORITY + " INTEGER," +
                   Mms.READ_REPORT + " INTEGER," +
                   Mms.REPORT_ALLOWED + " INTEGER," +
                   Mms.RESPONSE_STATUS + " INTEGER," +
                   Mms.STATUS + " INTEGER," +
                   Mms.TRANSACTION_ID + " TEXT," +
                   Mms.RETRIEVE_STATUS + " INTEGER," +
                   Mms.RETRIEVE_TEXT + " TEXT," +
                   Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," +
                   Mms.READ_STATUS + " INTEGER," +
                   Mms.CONTENT_CLASS + " INTEGER," +
                   Mms.RESPONSE_TEXT + " TEXT," +
                   Mms.DELIVERY_TIME + " INTEGER," +
                   Mms.DELIVERY_REPORT + " INTEGER," +
                   Mms.LOCKED + " INTEGER DEFAULT 0," +
                   Mms.SEEN + " INTEGER DEFAULT 0," +
                   Mms.SUB_ID + " INTEGER DEFAULT 0" +
                   ");");
        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_ADDR + " (" +
                   Addr._ID + " INTEGER PRIMARY KEY," +
                   Addr.MSG_ID + " INTEGER," +
                   Addr.CONTACT_ID + " INTEGER," +
                   Addr.ADDRESS + " TEXT," +
                   Addr.TYPE + " INTEGER," +
                   Addr.CHARSET + " INTEGER);");
        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PART + " (" +
                   Part._ID + " INTEGER PRIMARY KEY," +
                   Part.MSG_ID + " INTEGER," +
                   Part.SEQ + " INTEGER DEFAULT 0," +
                   Part.CONTENT_TYPE + " TEXT," +
                   Part.NAME + " TEXT," +
                   Part.CHARSET + " INTEGER," +
                   Part.CONTENT_DISPOSITION + " TEXT," +
                   Part.FILENAME + " TEXT," +
                   Part.CONTENT_ID + " TEXT," +
                   Part.CONTENT_LOCATION + " TEXT," +
                   Part.CT_START + " INTEGER," +
                   Part.CT_TYPE + " TEXT," +
                   Part._DATA + " TEXT," +
                   Part.TEXT + " TEXT);");

        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_RATE + " (" +
                   Rate.SENT_TIME + " INTEGER);");

        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_DRM + " (" +
                   BaseColumns._ID + " INTEGER PRIMARY KEY," +
                   "_data TEXT);");
    }
大家可以看出,彩信大致为以下5张表:pdu、addr、part、rate、drm

3.2.2 功能描述

pdu :存储彩信的基本信息
addr: 关于收件人的表,群发彩信时收件人地址就存在这里
part: 彩信的每个媒体文件(比如彩信有多少个音频,图片或视频)
drm:  彩信中媒体文件权限信息
rate:传送速度相关的信息

3.3 mms-sms provider

       该provider用于短彩信通用数据的存取,如会话信息、接收者、草稿(公共属性);

3.3.1 创建

private void createCommonTables(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE canonical_addresses (" +
                   "_id INTEGER PRIMARY KEY," +
                   "address TEXT);");
        db.execSQL("CREATE TABLE threads (" +
                   Threads._ID + " INTEGER PRIMARY KEY," +
                   Threads.DATE + " INTEGER DEFAULT 0," +
                   Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," +
                   Threads.RECIPIENT_IDS + " TEXT," +
                   Threads.SNIPPET + " TEXT," +
                   Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," +
                   Threads.READ + " INTEGER DEFAULT 1," +
                   Threads.TYPE + " INTEGER DEFAULT 0," +
                   Threads.ERROR + " INTEGER DEFAULT 0," +
                   Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);");
        db.execSQL("CREATE TABLE " + MmsSmsProvider.TABLE_PENDING_MSG +" (" +
                   PendingMessages._ID + " INTEGER PRIMARY KEY," +
                   PendingMessages.PROTO_TYPE + " INTEGER," +
                   PendingMessages.MSG_ID + " INTEGER," +
                   PendingMessages.MSG_TYPE + " INTEGER," +
                   PendingMessages.ERROR_TYPE + " INTEGER," +
                   PendingMessages.ERROR_CODE + " INTEGER," +
                   PendingMessages.RETRY_INDEX + " INTEGER NOT NULL DEFAULT 0," +
                   PendingMessages.DUE_TIME + " INTEGER," +
                   PendingMessages.LAST_TRY + " INTEGER);");
    }
公共的表:canonical_addresses、threads、pending_msgs

3.3.2 功能描述

 1) canonical_addresses: canonical_addresses 和联系人有关的表  在threads表的recipient_ids字段 存放的是参与此次对话的联系人的id,但是这个id并不是Contacts应用里面的id, 而是canonical_addresses表 的id,这就是canonical_addresses 表格的作用
 2)threads:该表非常重要存储的是会话相关的内容,一个会话表示的是当你新建一条短信,你的收件人和你就形成了一个会话,如果你的收件人和你这样的会话已经存在则不会新建。
 3)pending_msgs:该表存储的是已发送的彩信和待下载的彩信。

3.3.3 补充words表

    private void createWordsTables(SQLiteDatabase db) {
        try {
            db.execSQL("CREATE VIRTUAL TABLE words USING FTS3 (_id INTEGER PRIMARY KEY, index_text TEXT, source_id INTEGER, table_to_use INTEGER);");
       }
words存储了 短彩信中的单词 ,用于搜索时使用

4、总结

      这里对表的各种结构大致描述了一下,对于其中某些重要的表的解析,而后会跟进不上。




  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值