論Android系統源碼數據庫(mmssms.db)中幾個表以前的關係.java
首先明瞭未接信息的數據庫的位置在系統android
/data/data/com.android.providers.telephony/databases/mmssms.db 包下。面試
但願你們可以結合源碼中的數據庫
1. Telephony.java (主要講這些表裏有哪些字段)編程
2. MmsSmsProvider.java (ContentProvider被重寫)網絡
3. MmsProvider.java (ContentProvider被重寫)app
4. SmsProvider.java (ContentProvider被重寫)ide
5. Conversation.java 描述 mmssms數據庫的Threads表ui
前一段時間在開發項目時,遇到這樣的需求,要求將 未接短信,未接彩信的信息顯示在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 |
<null> |
京城最後升值時機!地鐵4號線無縫接駁,首二機場伴您起飛!純板社區景觀美宅大產權,樣板間華美綻開90平55萬,三期優惠進行中67659006
|
|
|
|
2 |
3 |
+8613366790288 |
1302359506626 |
0 |
<null> |
《人力資源管理》實戰特訓班.主講:企業招聘面試技巧、績效管理與薪酬體系設計於4月14-16日人民大學授課.報名010-57810898
|
|
|
|
3 |
4 |
+8618659506145 |
1302468808232 |
0 |
<null> |
6個月與老外交流無障礙!資深外教一對一,定製式教育,口語快速突破的高效課程模式!好方法不怕試,免費體驗課預定:51662230
|
|
|
|
4 |
1 |
1252013910095023 |
1302468964929 |
0 |
<null> |
Lockscreen team:你好,microsoft公司,誠邀你來面試... |
|
|
|
5 |
1 |
1252013910095023 |
1302468989263 |
0 |
<null> |
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 |
<null> |
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 |
<mms.smil> |
<null> |
不用關心 |
|
2 |
1 |
text/plain |
<1.txt> |
<null> |
I am mms body |
|
3 |
1 |
audio/midi |
<2.midi> |
/data/data/com.android.providers.telephony/app_parts/PART_130228532714
|
<null> |
|
4 |
1 |
image/gif |
<3.gif> |
/data/data/com.android.providers.telephony/app_parts/PART_1302285327200 |
<null> |
|
5 |
1 |
image/gif |
<4.gif> |
/data/data/com.android.providers.telephony/app_parts/PART_1302285327255 |
<null> |
|
6 |
1 |
text/plain |
<5.txt> |
<null> |
中國移動飛信搶沙發活動火熱登場!登陸WAP飛信參與活動,iPod nano、手機等大獎天天輪換送!點擊連接查看http://f.10086.cn/f/qzuo[經過移動夢網接入點訪問免流量費]
|
|
7 |
1 |
text/plain |
<6.txt> |
<null> |
【飛信提醒您】本條彩信不能以彩信方式回覆 |
|
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
若是該聯繫人被存爲聯繫人,那麼此人發彩信以及彩信時時,會在你的手機上這樣顯示
很明顯,他們應該屬於同一個聯繫人
好了,我就用到這麼多,但願對須要的人有所幫助,具體的本身去查看源碼吧