论Android系统源码数据库(mmssms.db)中几个表之前的关系.



首先明了未接信息的数据库的位置在系统

/data/data/com.android.providers.telephony/databases/mmssms.db 包下。

希望大家能够结合源码中的

1. Telephony.java (主要讲这些表里有哪些字段)

2. MmsSmsProvider.java (ContentProvider被重写)

3. MmsProvider.java (ContentProvider被重写)

4. SmsProvider.java (ContentProvider被重写)

5. Conversation.java 描述 mmssms数据库的Threads表





前一段时间在开发项目时,遇到这样的需求,要求将 未接短信,未接彩信的信息显示在Widget上。当我们查询mmssms.db数据库时,这其中涉及到以下几张表:

1. threads表

2. 存放短信的表(sms表)

3. 存放彩信的表(pdu表,part表)

4. 存放phone number的表( Canonical_address表)



能否将未接短信,彩信信息直接显示在Widget上,关键是必须要搞清出这4张表之间的表关系。根据我的编码经验,先抛砖引玉地在这里讲解出我的理解…



对于这几张表,我只简单地列出关键字段,省略部分均用(….)代替。

以下的 ”信息” 指代(mms,sms)


threads(表)

查询该表时,所需要的uri:

MMS_SMS_URI = Uri.parse("content://mms-sms")

MSG_QUERY_URI = Uri.parse("content://mms-sms/ conversations ?simple=true")

可以这样得到 Uri MSG_QUERY_URI = Uri.withAppendedPath(MMS_SMS_URI, "conversations").buildUpon().appendQueryParameter("simple", "true").build();



_id
date
message_count
recipient_ids
snippet
read
has_attchment
………

1
1302468989000
3
15
yulei team:你好,华为无线网络技术有限公司,诚邀您来进行面试....


0
1


2
1302343202189
1
32
京城最后升值时机!地铁4号线无缝接驳,首二机场伴您起飞!纯板社区景观美宅大产权,样板间华美绽放90平55万,三期优惠进行中67659006


1
0


3
1302359506000
1
33
《人力资源管理》实战特训班.主讲:企业招聘面试技巧、绩效管理与薪酬体系设计于4月14-16日人民大学授课.报名010-57810898


0
0


4
1302468808000
1
34
6个月与老外交流无障碍!资深外教一对一,定制式教育,口语快速突破的高效课程模式!好方法不怕试,免费体验课预约:51662230


0
0





threads表字段说明:

_id: 用于区分不同的电话号码,系统会为不同的电话号码分配不同的_id.

date: 收到信息的时间(如果收到来自同一个phone number多条信息,并且有对于一条信息未读,那么date表示收到的最后一条信息时的时间)

message_count: 收到的信息的数目(sms+mms)

snippet: 如果来自某个phone number,仅仅有一条信息,那么会是如下情况

如果是未接短信,代表未接短信的内容

如果是未接彩信,代表未接彩信的subject.

如果来自某个phone number,仅仅有多条信息,那么则是如下情况

如果是最后一条是未接短信,代表最后一条未接短信的内容

如果是最后一条是未接彩信,代表最后一条未接彩信的subject.

然而这个字段存储的仅仅是一条短信内容或者彩信subject的部分内容,其余内容用省略号表示。

read: 0. 代表未读。 1.代表 已读

has_attchment: 代表来自该phone number的信息是否包含有附件。

依据上面的表结构,也许会有人问,phone number 呢?有这样的疑问是非常正常的,别着急,学过数据库的人都知道,表结构之间并不是孤立的,而是相互关联的。phone number 会在另外几张表中出现。





Sms表

查询该表时的uri : URI_SMS_INBOX = Uri.parse("content://sms/inbox")

_id
thread_id
address
date
read
subject
body
locked



1
2
076922159797
1302343202189
1

京城最后升值时机!地铁4号线无缝接驳,首二机场伴您起飞!纯板社区景观美宅大产权,样板间华美绽放90平55万,三期优惠进行中67659006






2
3
+8613366790288
1302359506626
0

《人力资源管理》实战特训班.主讲:企业招聘面试技巧、绩效管理与薪酬体系设计于4月14-16日人民大学授课.报名010-57810898






3
4
+8618659506145
1302468808232
0

6个月与老外交流无障碍!资深外教一对一,定制式教育,口语快速突破的高效课程模式!好方法不怕试,免费体验课预约:51662230






4
1
1252013910095023
1302468964929
0

Lockscreen team:你好,microsoft公司,诚邀你来面试...




5
1
1252013910095023
1302468989263
0

Lockscreen team:你好,华为无线网络技术有限公司,诚邀您来进行面试....









Sms表字段说明

_id: 区分不同的短信。

threads_id: (外键)引用threads表的_id.

date: 该条短信接收的时间

read: 0表未读,1表已读

body: 表示具体的短信内容,(注意,虽然在thread表的snippet字段已经存储了一部分body,但是那里的并不全,仅仅是一部分body)

locked: 该字段我也不是很清楚,用到的不多,不过如果我标识某条信息为locked时,当我再删除这条信息时,系统会提示我“是否删除locked信息”。

很明显以上:_id为4.或5的短信,来自同一个phone number,也就是说他们的thread_id是相同的.





Pdu表:

URI_MMS_INBOX = Uri.parse("content://mms/inbox");

_id
Thread_id
date
Msg_box
read
M_id
sub
Ct_l
m_type
…..

1
1
1302256504
1
1
040817550491000002112
Lockscreïš15151656666

132





Pdu表字段说明:

_id: 区分不同的彩信

thread_id : 外键 (引用thread表的_id)

msg_box: 区分彩信的收件箱,发件箱,草稿箱等.

很明显1.代表收件箱

read:是否已读,0 未读,1.已读

sub: 彩信的subject

ct_l: 如果彩信太大,或者由于网络原因,也又是由于手机设备原因,dowload失败,彩信看不了,这个字段就会有彩信的网址(我曾经见到过一次,http://格式的,就是一个网址)



Part表:

表的路径Uri MMS_PART_URI = Uri.parse("content://mms/part")



_id
mid
ct
cid
_data
text


1
1
application/smil


不用关心


2
1
text/plain
<1.txt>

I am mms body


3
1
audio/midi
<2.midi>
/data/data/com.android.providers.telephony/app_parts/PART_130228532714





4
1
image/gif
<3.gif>
/data/data/com.android.providers.telephony/app_parts/PART_1302285327200



5
1
image/gif
<4.gif>
/data/data/com.android.providers.telephony/app_parts/PART_1302285327255



6
1
text/plain
<5.txt>

中国移动飞信抢沙发活动火热登场!登录WAP飞信参与活动,iPod nano、手机等大奖每天轮换送!点击链接查看http://f.10086.cn/f/qzuo[通过移动梦网接入点访问免流量费]




7
1
text/plain
<6.txt>

【飞信提醒您】本条彩信不能以彩信方式回复





Part表字段说明:

_id: 区分某条彩信的不同附件(包括文本,图片,音频,视频等格式)

mid: 外键,引用pdu表的_id. 指示该附件属于哪条彩信(一条彩信有可能包含有多个图片,多个音频,多个视频等)

ct: 指示附件是什么类型的(text/ 表示文本, audio/ 表示音频, video/表是 视频 , image/

表示图片)

_data: 标明附件存放在手机的哪个地方

text: 表示彩信的body。





Canonical_address表

查询这张表所需要的uri:

MMS_SMS_ADDRESS_URI = Uri

.parse("content://mms-sms/canonical-addresses");



_id
address

15
1-391-009-5023

32
076922159797

33
+8613366790288

34
+8618659506145




Canonical_address表字段说明:

_id: 外键,引用threads表的recipient_id字段

address: 代表给我们发短的那个人的phone number



对于编程时,phone number 1: 1252013423447866

如果该联系人没有被存为联系人,那么此人发彩信时,会在你的手机上这样显示

Phone number 2: +8613423447866

如果该联系人没有被存为联系人,那么此人发短信时,会在你的手机上这样显示

Phone number 3: 13423447866

如果该联系人被存为联系人,那么此人发彩信以及彩信时时,会在你的手机上这样显示



很明显,他们应该属于同一个联系人



好了,我就用到这么多,希望对需要的人有所帮助,具体的自己去查看源码吧

更多相关文章

  1. Debug Android(安卓)and Linux suspend and resume
  2. 使用android中的aapt查看安卓apk包信息
  3. android平台解析epub格式的书籍信息
  4. 使用android中的aapt查看安卓apk包信息
  5. Android(安卓)调试之 Log和LogCat的详解
  6. 调用Android系统设置中的Intent
  7. Android打开系统设置界面
  8. android中SMS
  9. android locationManager定位

随机推荐

  1. MySQL之information_schema数据库详细讲
  2. MySql分页时使用limit+order by会出现数
  3. SQL insert into语句写法讲解
  4. mysql回表致索引失效案例讲解
  5. mysql IS NULL使用索引案例讲解
  6. mysql中TIMESTAMPDIFF案例详解
  7. 实操MySQL+PostgreSQL批量插入更新insert
  8. MYSQL row_number()与over()函数用法详解
  9. MySQL隐式类型转换导致索引失效的解决
  10. 浅谈MySQL数据查询太多会OOM吗