trigger:
insert_mms_pending_on_insert:当pdu表中插入了一条数据,类型为130(彩信通知)或135(待发送阅读报告),说明有信息要发送,trigger会在pending_msgs表插入一条数据;
delete_mms_pending_on_update:当pdu表中有记录的msg_box从4-待发件箱改为别的值,说明有一条信息已经发出等,就从pending_msgs表中删除一条对应数据
短信表:sms、raw、sr_pending、attachments。
彩信表:pdu、part、addr、drm、rate。
公共表:canonical_addresses、threads、pending_msg、words。
短信表sms
_id
短信id
thread_id
对应的会话id
address
对方的号码
person
联系人列表里的ID
date
接收时间
data_sent
发送时间
protocol
read
用户是否看过这条信息
0-未读;1-已读
status
信息状态,默认是-1
待发送32;
发送失败64;
已送达0(开启了送达报告)
type
信箱类型id值
和pdu.msg_box作用和赋值相同
reply_path_present
subject
信息主题,一般为空
body
短信内容
service_center
服务中心即短信中心,只有gsm
卡有,如+8613800100500
locked
是否锁定,默认0=不锁定
error_code
seen
用户是否看过这条信息的通知
0-没看过;1-看过了
短信表raw
_id
流水号
date
reference_number
count
sequence
destination_port
address
pdu
短信表sr_pending:好像没有用到?
reference_number
action
data
短信表attachments
sms_id
content_url
offset
公共表threads
_id
流水号
date
会话中最后一条信息的日期(不包括
草稿),也用作会话在会话列表中
排序
message_count
会话中的信息数量
recipient_ids
多个canonical_addresses.id组成的
串,多个id时以空格分隔
snippet
片段,会话中最后一条信息的内容,
如果是彩信就是主题
snippet_cs
snippet的编码格式
read
是否有未读信息,0-有未读,1-没有
type
error
has_attachment
有无附件(不必是最后一条信息)
彩信表pdu:彩信主表
_id | 彩信id |
thread_id | 对应的会话id |
date | 接收时间 |
date_sent | 发送时间 |
msg_box | 信箱类型id值 和sms.type作用和赋值相同 Telephony.Type |
read | 用户是否看过这条信息 0-未读;1-已读 |
m_id |
|
sub | subject彩信的主题 |
sub_cs | subject charset 主题的字符集类型 |
ct_t | content type内容类型,信息中存储的 是多媒体信息还是其他,如m_type= 128/132(发、收的正文)时,值是 application/vnd.wap.multipart.related 而m_type=134(送达报告)时值为空 |
ct_l | content-location 在彩信中心的下载url |
exp | expire过期时间,通常是从发送时间 开始后3天=24x3小时=72小时 |
m_cls | message class信息类别如 个人(值personnal)、广告等 X-Mms-Message-Class |
m_type | 信息类型,和 pending_msgs.msg.type一样 X-Mms-Message-Type |
v | version这条彩信符合的规范版本 在PduHeader中定义了16/17/18/19 当前版本是18 |
m_size |
|
pri | priority优先级 |
rr | read_report 是否收到了阅读报告 |
rpt_a |
|
resp_st | 发送彩信后,mmsc应答的状态 字段X-Mms-Response-Status m_type=MESSAGE_TYPE_SEND_CONF |
st | X-Mms-Status Field |
tr_id |
|
retr_st |
|
retr_txt |
|
retr_txt_cs |
|
read_status |
|
ct_cls |
|
resp_txt |
|
d_tm |
|
d_rpt | delivery report 是否收到了送达报告,这个字段其实 是无效的,起作用的是单独的一条 送达报告记录 |
locked | 是否锁定,默认0=不锁定 |
seen | 用户是否看过这条信息的通知 0-没看过;1-看过了 |
公共表canonical_addresses,存放thread的收件人的地址
_id | 流水号 |
address | 号码:电话号码或email等 |
彩信part表:存储彩信内容、附件等
_id | 流水号 |
mid | 对应pdu._id |
seq |
|
ct | content内容类型如图片image/jpeg |
name |
|
chset |
|
cd |
|
fn |
|
cid |
|
cl |
|
ctt_s |
|
ctt_t |
|
_data | 附件的存储位置如 /data/data/com.android.providers .telephony/app_parts/PART_316077722124 |
text |
|
公共pending_msgs表:待发送信息表
_id | 流水号 |
proto_type |
|
msg_id | 对应pdu._id |
msg_type | 信息类型,和pdu.m_type一样 |
err_type |
|
err_code |
|
retry_index | 已尝试的发送次数 |
due_time |
|
last_try |
|
彩信addr表:地址表,主要字段是电话号码address
_id | 流水号 |
msg_id | 对应pdu.msg_id |
contact_id |
|
address | 号码 |
type | 发出信息/接收信息,主要两个值151/137 151=PduHeader.To 137=PduHeader.From |
charset |
|
彩信表drm
_id |
|
_data |
|
彩信表rate
sent_time |
|
公共表words
_id |
|
index_text |
|
source_id |
|
table_to_use |
|
MessageListAdapter.java会监听数据的变化onContentChanged,然后在ComposeMessageActivity.mDataSetChangedListener.onContentChanged查询数据,查询完成后在BackgroundQueryHandler.onQueryComplete中调用mMsgListAdapter.changeCursor(cursor);又回到MessageListAdapter,数据cursor变化引起界面重绘,这样某一条信息的下载状态就实时显示了如正在下载、没有下载等。
ConversationListAdapter.java和MessageListAdapter.java两个Adapter都注册了数据变化的监听器,最后在Activity:ConversationList.java和ComposeMessageActivity.java中显示出来。
字段read:如果sms.type/mms.msg_box不是1-收件箱,该字段值在insert数据的时候都会赋值1-已读(不是收件箱,这个字段就没用了),赋值是在SmsProvider.insert和MmsProvider.insert中
read和seen很多时候同时为0或1,但是也有不一致的情况,如:同时收到多个联系人的信息时,会在状态条下拉栏提示,当用户进入(无论是点击通知进入还是点击mms程序进入)到conversationlist(而不是messagelist,没有真正阅读这些信息),这时seen=1表示用户已看过通知(即使重启手机也不会再提示了),read=0表示用户没看过信息
MMS中保存数据库的操作可以搜索:Inbox.CONTENT_URI,对彩信的保存还有persist