理清contactsprovider
生活随笔
收集整理的這篇文章主要介紹了
理清contactsprovider
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
初步了解android contact provider
??
??????? android的聯系人數據單獨拿出來做成ContactsProvider,眾多的table和view整體看下來,使得聯系人的數據錯綜復雜。但是我們在開發的過程并不需要將所有的table都搞清楚。用到最多的是 ContactsContract.Contacts、ContactsContract.RawContacts、ContactsContract.Data這三張表格。
??????? 先預覽一下,一個聯系人數據的存儲結構:
可以很直觀的看出。一個聯系人在contacts2.db中(除了profile.db中的自己外),數據基本存放在3張表中,在ContactsContract.Contacts中會存在一條記錄,在ContactsContract.RawContacts中可能存在多個記錄,ContactsContract.Data中的數據是對ContactsContract.RawContacts的詳細描述。
???????
???? ? ? ? ? ? ? ?? ?
?????????????????????????? (圖1)
??????? ContactsContract.Contacts的表格大致如下,_id對應著的就是我們在contacts中看到的一個聯系人。有一點需要注意的是,當刪除掉一個聯系人時,表中的記錄會刪除,但是_id并不會減少,而是一直增加,所以有可能看到的_id是1,2,4...這樣的記錄。
???????
??????? ContactsContract.RawContacts的表格結構大致如下,它里面的記錄主要是針對特定賬戶下的聯系人數據的描述(data表中的數據)。這邊的contact_id對應的是contacts表中的_id,一個聯系人在raw_contacts表格中可能存在一條以上的記錄,這主要是由于caccount_name和account_type不同造成的。
??????? 這邊需要用一個例子來幫助理解:
假設我在我的手機上有三個賬戶 gaojian@gmail.com、gaojian3301@gmail.com,這兩個賬戶的“同步聯系人”都被check上,當我添加一個聯系人到手機里時,這個聯系人會同時被備份到這個兩個賬戶中去,所以這兩個記錄在raw_contacts表格中的contact_id會一樣。
??????? data表格中記錄的數據是對raw_contacts中數據的詳細描述。這邊的data1存儲的值就是聯系人在搜索時會search的值;data15用來存儲一些比較大的二進制對象,比如說聯系人的頭像縮略圖。
這一邊需要注意一個事情:在我們開發或者測試的過程中,不要將與MMIETYPE格式不匹配的數據存入data中(比如將email的值設置為1233445),這可能會造成data數據的丟失,更甚者會導致provider出問題(這個我猜測比如在發送Email的時候,去選擇contacts,返回值可能會有問題,沒有驗證過)。
??????? 總結一下,我們可以從contacts中找到我們想要看的聯系人,在raw_contacts中可以看到的是這個聯系人一些數據的基本描述,而data提供給我們的是這個聯系人所有的具體信息。這三張表格就是在平時開發中,打交道最多的表格。當然,如果要獲取和修改群組的信息,那么還會接觸到group這張表格;而篩選的表格對應的是search_index。
??????
????? 放一張android官方api的圖做個了斷:
?????????????????????????????????????????????
??
??????? android的聯系人數據單獨拿出來做成ContactsProvider,眾多的table和view整體看下來,使得聯系人的數據錯綜復雜。但是我們在開發的過程并不需要將所有的table都搞清楚。用到最多的是 ContactsContract.Contacts、ContactsContract.RawContacts、ContactsContract.Data這三張表格。
??????? 先預覽一下,一個聯系人數據的存儲結構:
可以很直觀的看出。一個聯系人在contacts2.db中(除了profile.db中的自己外),數據基本存放在3張表中,在ContactsContract.Contacts中會存在一條記錄,在ContactsContract.RawContacts中可能存在多個記錄,ContactsContract.Data中的數據是對ContactsContract.RawContacts的詳細描述。
???????
???? ? ? ? ? ? ? ?? ?
?????????????????????????? (圖1)
??????? ContactsContract.Contacts的表格大致如下,_id對應著的就是我們在contacts中看到的一個聯系人。有一點需要注意的是,當刪除掉一個聯系人時,表中的記錄會刪除,但是_id并不會減少,而是一直增加,所以有可能看到的_id是1,2,4...這樣的記錄。
| _id | starred | lookup | photo_id |
| 1 | 0 | ?... | <null> |
| 2 | 0 | ?... | <null> |
| 4 | 1 | ?... | 1 |
??????? ContactsContract.RawContacts的表格結構大致如下,它里面的記錄主要是針對特定賬戶下的聯系人數據的描述(data表中的數據)。這邊的contact_id對應的是contacts表中的_id,一個聯系人在raw_contacts表格中可能存在一條以上的記錄,這主要是由于caccount_name和account_type不同造成的。
??????? 這邊需要用一個例子來幫助理解:
假設我在我的手機上有三個賬戶 gaojian@gmail.com、gaojian3301@gmail.com,這兩個賬戶的“同步聯系人”都被check上,當我添加一個聯系人到手機里時,這個聯系人會同時被備份到這個兩個賬戶中去,所以這兩個記錄在raw_contacts表格中的contact_id會一樣。
| _id | contact_id | account_name | account_type | deleted |
| 1 | 1 | gaojian@gmail.com | com.google | 1 |
| 2 | 1 | gaojian1305039@163.com | 163.com | ?0 |
??????? data表格中記錄的數據是對raw_contacts中數據的詳細描述。這邊的data1存儲的值就是聯系人在搜索時會search的值;data15用來存儲一些比較大的二進制對象,比如說聯系人的頭像縮略圖。
這一邊需要注意一個事情:在我們開發或者測試的過程中,不要將與MMIETYPE格式不匹配的數據存入data中(比如將email的值設置為1233445),這可能會造成data數據的丟失,更甚者會導致provider出問題(這個我猜測比如在發送Email的時候,去選擇contacts,返回值可能會有問題,沒有驗證過)。
| _id | raw_contact_id | mimetype_id | data1 | data2 | data15 |
| 1 | 1 | 6 |
|
| <null> |
| 2 | 1 | 5 | 110 | 1 | <null> |
| 3 | 3 | 6 | gaojian | gao | <null> |
??????? 總結一下,我們可以從contacts中找到我們想要看的聯系人,在raw_contacts中可以看到的是這個聯系人一些數據的基本描述,而data提供給我們的是這個聯系人所有的具體信息。這三張表格就是在平時開發中,打交道最多的表格。當然,如果要獲取和修改群組的信息,那么還會接觸到group這張表格;而篩選的表格對應的是search_index。
??????
????? 放一張android官方api的圖做個了斷:
?????????????????????????????????????????????
總結
以上是生活随笔為你收集整理的理清contactsprovider的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在matlab中,简单地利用RS485协
- 下一篇: 单片机c语言1602怎么接线,lcd16