1.首先是联系人实体类:
/** 用于描述一个联系人 */
public class Contact {
private int id;
private String name;
private String email;
private String address;
private int photoId;
private Bitmap photo;
private String phone;
public Contact() {
// TODO Auto-generated constructor stub
}
//..get()set()
2.和联系人相关的
主要是查询下图中画图表,分别是:contracts,data,mimetype和rawcontacts
简单的几下就是raw_contract_id是和联系人对应的 ,是raw contracts 的主键,是contract,和data表的外键。
mimetype是一张映射表,告诉了数据存放的意义,如图:
data表中后面有15个字段,在android.provider.ContactsContract的内部类Data里面有解释各个字段的含义:
例如:
By convention, binary data is stored in DATA15. The thumbnail of the photo is stored in this column.</td>
所以:
流程就是先插Contacts,查出联系人的raw contracts id 和 photo id 字段,然后通过raw contracts id 查询raw contracts表 得到其他信息封装起来
在业务封装类的方法里面
//联系人
List<Contact> contacts=new ArrayList<Contact>();
//先查询Contacts表
ContentResolver r=context.getContentResolver();
//Uri uri=Uri.parse("content://com.android.providers.contact/contacts");
Uri uri=Contacts.CONTENT_URI;
//这里要用这个name_raw_contact_id 而不是那个 Contact._ID
String[] columns={"name_raw_contact_id", Contacts.PHOTO_ID};
Cursor c=r.query(uri, columns, null, null, null);
String[] dataColumns={
Data._ID, <span style="white-space:pre"> </span>//0
Data.MIMETYPE, //1**
Data.RAW_CONTACT_ID, //2
Data.DATA1, //3
Data.DATA15}; //4
while(c.moveToNext()){
Contact contact=new Contact();
int id=c.getInt(0);
int photoId=c.getInt(1);
contact.setId(id);
contact.setPhotoId(photoId);
Cursor c2=r.query(Data.CONTENT_URI, dataColumns, Data.RAW_CONTACT_ID+"="+id, null, null);
while(c2.moveToNext()){
int dataId=c2.getInt(0);
String mimetype=c2.getString(1);
if(mimetype.equals(Email.CONTENT_ITEM_TYPE)){
String email=c2.getString(3);
contact.setEmail(email);
}else if(mimetype.equals(Phone.CONTENT_ITEM_TYPE)){
String phone=c2.getString(3);
contact.setPhone(phone);
}else if(mimetype.equals("vnd.android.cursor.item/postal-address_v2")){
String address=c2.getString(3);
contact.setAddress(address);
}else if(mimetype.equals("vnd.android.cursor.item/name")){
String name=c2.getString(3);
contact.setName(name);
}
}
c2.close();
contacts.add(contact);
}
//排序按中文拼音首字母
Collections.sort(contacts, new SortChineseName());