RAW_CONTACT子表的查詢很有意思。
RAW_CONTACT子表有很多。主要的有:
android.provider.ContactsContract.CommonDataKinds.StructuredName;
android.provider.ContactsContract.CommonDataKinds.Phone;
android.provider.ContactsContract.CommonDataKinds.Email;
android.provider.ContactsContract.CommonDataKinds.Organization;
我們可以通過以下形式來進行查詢
// Set our expandable list adapter
String[] projection = new String[] {
Phone._ID,
Phone.DISPLAY_NAME,
Phone.NUMBER,
Phone.RAW_CONTACT_ID,
};
Cursor contactData = managedQuery(
Phone.CONTENT_URI,
null, //這裡是查詢所有的列。可以用projection代替來進行指定查詢
null,
null,
null);
我用下面的語句列印出查詢到所有列名
(注意用Email查詢出的列一樣,說明不同子表查的列數量一樣,只是在DATA1到DATA15的意義不同)
int colCount=contactData.getColumnCount();
for(int i=0;i<colCount;i++)
Log.i(TAG,i+"i:"+contactData.getColumnName(i));
但列印出來的列比我想象的多很多。我想Phone.CONTENT_URI是對應資料庫的“視圖”概念
查詢所得一共有55列
一、子表本身資料,ContactsContract.Data中聲明的25個列:
變數名 列名 備忘
_ID _id
MIMETYPE mimetype
RAW_CONTACT_ID raw_contact_id
IS_PRIMARY is_primary
IS_SUPER_PRIMARY is_super_primary
DATA_VERSION data_version
DATA1~DATA15 data1~data15
SYNC1~SYNC4 data_sync1~data_sync4
二、和ContactsContract.StatusUpdates串連,所得的6項資料
變數名 列名 備忘
PRESENCE mode PRESENCE_STATUS變數也是“mode”,但按照Data的文檔是PRESENCE
STATUS status PRESENCE_CUSTOM_STATUS變數也是“mode”,但按照Data的文檔應該是STATUS
STATUS_TIMESTAMP status_ts
STATUS_RES_PACKAGE status_res_package
STATUS_LABEL status_label
STATUS_ICON status_icon
注意1:其實PRESENCE_STATUS和PRESENCE_CUSTOM_STATUS並沒有在StatusUpdates申明的列當中。當然也就不可能被串連進來。
注意2:StatusUpdates共有11項資料,但還有5項資料沒被串連進來。
他們是DATA_ID,PROTOCOL,CUSTOM_PROTOCOL,IM_HANDLE, IM_ACCOUNT。
三、串連RawContacts所得的11項目資料。
變數名 列名 備忘
CONTACT_ID contact_id
TIMES_CONTACTED times_contacted
LAST_TIME_CONTACTED last_time_contacted
STARRED starred
CUSTOM_RINGTONE custom_ringtone
SEND_TO_VOICEMAIL send_to_voicemail
ACCOUNT_NAME account_name
ACCOUNT_TYPE account_type
SOURCE_ID sourceid
VERSION version
DIRTY dirty
注意1:雖然RawContacts共擁有18項資料,但這裡只包含了11項目。還有7項沒被包含進來。
他們分別是_ID,AGGREGATION_MODE,DELETED,SYNC1~SYNC4
注意2:RawContactsColumns一共定義的三項目資料,但是只有一項CONTACT_ID被包含進來。
AGGREGATION_MODE和DELETED沒有被包含進來
按照ContactsContract.Data中的文檔,只有CONTACT_ID,AGGREGATION_MODE,DELETED三項會被包含來的啊。
但實際並非如此。WHY?
四、串連Contacts所得的9項目資料。
變數名 列名 備忘
LOOKUP_KEY lookup
PHOTO_ID photo_id
IN_VISIBLE_GROUP in_visible_group
CONTACT_PRESENCE contact_presence
ONTACT_STATUS contact_status
CONTACT_STATUS_TIMESTAMP contact_status_ts
CONTACT_STATUS_RES_PACKAGE contact_status_res_package
CONTACT_STATUS_LABEL contact_status_label
CONTACT_STATUS_ICON contact_status_icon
注意1:雖然RawContacts共擁有17項資料,但這裡只包含了9項目。還有8項沒被包含進來。
他們分別是: _ID,NAME_RAW_CONTACT_ID,DISPLAY_NAME_PRIMARY,TIMES_CONTACTED,
LAST_TIME_CONTACTED,STARRED,CUSTOM_RINGTONE,SEND_TO_VOICEMAIL
注意2:在RawContacts和Contacts中都有一個名叫TIMES_CONTACTED的變數名,且他們的列名都為“times_contacted”。
參照TIMES_CONTACTED在兩個類的中的定義,
Contacts中TIMES_CONTACTED值為Contacts組中所有RawContacts的TIMES_CONTACTED值的最大值。
所以查詢所得名叫times_contacted的列應該是對於RawContacts的TIMES_CONTACTED。
LAST_TIME_CONTACTED同理。
注意3:STARRED參照定義也可知查詢所得名叫STARRED的列應該是對於RawContacts的STARRED。
注意4:對於CUSTOM_RINGTONE和SEND_TO_VOICEMAIL, 在RawContacts和Contacts的列中都有對他們的申明,且它們的定義也相同。
參照它們的定義文檔來看也不是很清楚。
但我們這裡主要是針對RawContacts的查詢,我想他們應該是來自於RawContacts,而不是Contacts。
注意5:對於TIMES_CONTACTED,LAST_TIME_CONTACTED,STARRED,CUSTOM_RINGTONE,SEND_TO_VOICEMAIL
然參照ContactsContract.Data文檔他們是被Contacts串連進來,
但通過以上分析,他們沒有Contact串連進來。而是通過RawContacts串連進來。
五、Data.GroupMembership的一項資料。
變數名 列名 備忘
GROUP_SOURCE_ID group_sourceid
這個資料應該是通過串連Data.GroupMembership所得的。但是文檔中並沒說明
六,未確定來來源資料2項
列名 備忘
display_name
res_package
注意1:display_name可能來自ContactsColumns的DISPLAY_NAME,及來自於Conact.
但關於Conact的DISPLAY_NAME來自於資料庫的哪裡還是puzzle.可能來自於DISPLAY_NAME_PRIMARY。
為什麼不能直接查詢Contacts的DISPLAY_NAME_PRIMARY?也是個puzzle.
注意2:res_package來自哪裡?沒任何線索。