短信数据库分析----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 数据库概况
![](https://img-my.csdn.net/uploads/201209/26/1348645708_9603.jpg)
说明:上图是短信数据库所有表,这些表被不同的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、总结
这里对表的各种结构大致描述了一下,对于其中某些重要的表的解析,而后会跟进不上。