Android通讯录
联系人相关最主要的类:
ContactsContract
其中有三个表
ContactsContract.Contacts表
表示不同联系人的行,基于聚合的原始联系人行。
ContactsContract. RawContacts表
包含联系人数据摘要的行,针对特定用户帐户和类型。
ContactsContract. Data表
包含原始联系人详细信息(例如电子邮件地址或电话号码)的行。
Minetypes表
数据类型
还有一些辅助类
ContactsContract.CommonDataKinds类型专用列名称

通过查询联系人Contacts表
该表保存了本机保存的所有联系人,每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
以下为每一列的列
数据库列名:phonetic_name
数据库列名:custom_ringtone
数据库列名:contact_status_ts
数据库列名:photo_file_id
数据库列名:contact_status_res_package
数据库列名:notification_tone
数据库列名:display_name_alt
数据库列名:sort_key_alt
数据库列名:is_care
数据库列名:starred
数据库列名:contact_status_label
数据库列名:is_user_profile
数据库列名:has_phone_number
数据库列名:meetime_nick_name
数据库列名:contact_last_updated_timestamp
数据库列名:photo_uri
数据库列名:phonebook_bucket
数据库列名:display_name:联系人名称
数据库列名:sort_key
数据库列名:photo_thumb_uri
数据库列名:contact_presence
数据库列名:in_default_directory
数据库列名:times_contacted:通话记录的次数
数据库列名:vibration_type
数据库列名:_id:表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据
数据库列名:meetime_photo_uri
数据库列名:name_raw_contact_id
数据库列名:phonebook_bucket_alt
数据库列名:last_time_contacted:最后的通话时间
数据库列名:is_private
数据库列名:pinned
数据库列名:photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空
数据库列名:title
数据库列名:contact_chat_capability
数据库列名:contact_status_icon
数据库列名:in_visible_group
数据库列名:phonebook_label
数据库列名:hw_account_id
数据库列名:display_name_source
数据库列名:company
数据库列名:meetime_photo_thumb_uri
数据库列名:has_email
数据库列名:phonetic_name_style
数据库列名:send_to_voicemail
数据库列名:is_camcard
数据库列名:lookup:是一个持久化的储存,因为用户可能会改名,但是它改不了lookup
数据库列名:phonebook_label_alt
数据库列名:starred_order
数据库列名:contact_status
数据库列名:meetime_photo_file_id
数据库列名:has_name
数据库列名:meetime_photo_id
通过查询联系人RawContacts表
该表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID: RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.RawContacts.CONTENT_URI, null, null, null, null);
以下为每一列的列
数据库列名:phonetic_name
数据库列名:custom_ringtone
数据库列名:account_type
数据库列名:aggregation_mode
数据库列名:notification_tone
数据库列名:display_name_alt
数据库列名:sort_key_alt
数据库列名:is_care
数据库列名:starred
数据库列名:meetime_nick_name
数据库列名:phonebook_bucket
数据库列名:display_name:联系人名称
数据库列名:sort_key
数据库列名:version:版本号,用于监听变化
数据库列名:meetime_default_number
数据库列名:times_contacted
数据库列名:vibration_type
数据库列名:_id
数据库列名:metadata_dirty
数据库列名:account_type_and_data_set
数据库列名:phonebook_bucket_alt
数据库列名:last_time_contacted:最后联系的时间
数据库列名:is_private
数据库列名:pinned
数据库列名:contact_id
数据库列名:title
数据库列名:phonebook_label
数据库列名:account_name
数据库列名:hw_account_id
数据库列名:display_name_source
数据库列名:company
数据库列名:phonetic_name_style
数据库列名:send_to_voicemail
数据库列名:is_camcard
数据库列名:dirty
数据库列名:sourceid
数据库列名:meetime_gender
数据库列名:phonebook_label_alt
数据库列名:old_local_id
数据库列名:starred_order
数据库列名:data_set
数据库列名:backup_id
数据库列名:primary_meetime_contact
数据库列名:deleted:删除标志, 0为默认 1 表示这行数据已经删除
数据库列名:sync4
数据库列名:sync3
数据库列名:raw_contact_is_user_profile
数据库列名:meetime_tips_marked
数据库列名:sync2
数据库列名:sync1
通过查询联系人Data表
该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表保存了两个ID: MimeTypeID和RawContactID,从而将data表和raw_contacts表联系起来。联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,data1列保存号码,data2列保存号码类型(手机号码、家庭号码、工作号码等)。
data1 到 data15 这里保存着联系人的信息 联系人名称 联系人电话号码 电子邮件 备注 等等。
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
注意:ContactsContract.CommonDataKinds.Phone.CONTENT_URI既为ContactsContract.Data.CONTENT_URI加上phones
以下为每一列的列名
数据库列名:phonetic_name
数据库列名:custom_ringtone
数据库列名:contact_status_ts
数据库列名:account_type
数据库列名:notification_tone
数据库列名:is_care
数据库列名:starred
数据库列名:contact_status_label
数据库列名:chat_capability
数据库列名:raw_contact_id:通过raw_contact_id可以找到 raw_contact表中相对的数据。
数据库列名:contact_last_updated_timestamp
数据库列名:phonebook_bucket
数据库列名:sort_key
数据库列名:version
数据库列名:in_default_directory
数据库列名:vibration_type
数据库列名:account_type_and_data_set
数据库列名:status
数据库列名:phonebook_bucket_alt
数据库列名:last_time_contacted
数据库列名:is_primary
数据库列名:photo_id
数据库列名:contact_status_icon
数据库列名:in_visible_group
数据库列名:phonebook_label
数据库列名:account_name
数据库列名:hw_account_id
数据库列名:display_name_source
数据库列名:meetime_photo_thumb_uri
数据库列名:meetime_gender
数据库列名:data9
数据库列名:dirty
数据库列名:sourceid
数据库列名:phonetic_name_style
数据库列名:is_camcard
数据库列名:data8
数据库列名:data7
数据库列名:data6
数据库列名:data5
数据库列名:data4
数据库列名:data3
数据库列名:data2
数据库列名:data1
数据库列名:starred_order
数据库列名:meetime_photo_file_id
数据库列名:backup_id
数据库列名:has_name
数据库列名:preferred_phone_account_component
数据库列名:raw_contact_is_user_profile
数据库列名:status_ts
数据库列名:data10
数据库列名:preferred_phone_account_id
数据库列名:data12
数据库列名:mimetype
数据库列名:status_icon
数据库列名:data11
数据库列名:data14
数据库列名:data13
数据库列名:hash_id
数据库列名:data15
数据库列名:status_res_package
数据库列名:data_version
数据库列名:photo_file_id
数据库列名:contact_status_res_package
数据库列名:group_sourceid
数据库列名:display_name_alt
数据库列名:sort_key_alt
数据库列名:mode
数据库列名:last_time_used
数据库列名:has_phone_number
数据库列名:meetime_nick_name
数据库列名:carrier_presence
数据库列名:res_package
数据库列名:photo_uri
数据库列名:data_sync4
数据库列名:times_used
数据库列名:display_name
数据库列名:data_sync1
数据库列名:data_sync2
数据库列名:data_sync3
数据库列名:photo_thumb_uri
数据库列名:status_label
数据库列名:meetime_default_number
数据库列名:contact_presence
数据库列名:times_contacted
数据库列名:_id
数据库列名:meetime_photo_uri
数据库列名:name_raw_contact_id
数据库列名:is_private
数据库列名:pinned
数据库列名:contact_id
数据库列名:title
数据库列名:contact_chat_capability
数据库列名:company
数据库列名:has_email
数据库列名:send_to_voicemail
数据库列名:lookup
数据库列名:phonebook_label_alt
数据库列名:is_super_primary
数据库列名:data_set
数据库列名:contact_status
数据库列名:primary_meetime_contact
数据库列名:meetime_photo_id
Minetypes表
有关联系人的增删改查操作
读取联系人需要步骤如下:
1.先读取contacts表,获取ContactsID;
2.再在raw_contacts表中根据ContactsID获取RawContactsID;
3.然后就可以在data表中根据RawContactsID获取该联系人的各数据了。
新建联系人步骤如下:
1.新建联系人时, 根据contacts、raw_ contacts两张表中ID的使用情况,自动生成ContactID和RawContactID。
2.Android源码新建重复姓名的联系人的ContactID是不重复的,所以会重复显示。
3.用下面的代码新建联系人,如果多次新建的联系人的姓名是一样的,生成的ContactID也会重复, RawContactID不会重复,我们在读取联系人的时候可以获取所有同姓名联系人的号码等信息,在显示联系人的时候,重复姓名的联系人的所有字段信息都会合并起来显示为一个联系人。
删除联系人:
非常简单只需要将raw_contacts表中指定RawContactID的行删除,其他表中与之关联的数据都会自动删除。
更新联系人:
联系人的所有信息都是保存在data表中,所以要更新联系人,我们只需要根据RawContactID和MIMETYPE修改data表中的内容。