首先,我们需要知道的两个Uri:
1、Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");//查到data表中raw_contact_id
2、Uri uri1 = Uri.parse("content://com.android.contacts/data");
想取数据库里面的信息,就必须要知道表的结构我们看一下view_data表:
我们只需要关心下面三列数据:
从表中我们可以看出,Google将联系人信息放在了一列中,也就是data1列,根据raw_contact_id来区分是否为同一个人的信息,根据mimetype区分联系人信息中的name、phone、email,所以首先我们要获得的是raw_contact_id,但是view_data表中的raw_contact_id是重复的。
下面我们再来看一张表raw_contacts:
从这张表中,我们可以获得联系人的raw_contact_id,也就可以获得联系人的个数,然后通过raw_contact_id获取每个联系人。
表的结构了解了,下面我们来看代码:
public void readContacts(){ String name = null; String phone= null; String eMail= null; Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri uri1 = Uri.parse("content://com.android.contacts/data"); Cursor cursor = getContentResolver().query(uri,new String[]{"contact_id"},null,null,null); while (cursor.moveToNext()){ String contacts_id = cursor.getString(0); //System.out.println("contact_id :"+contacts_id); if (contacts_id!=null){ /** * projection 第二个参数,要查询的列,为null则是查询所有的列 * selection 第三个参数,根据什么条件查询 * selectionArgs 第四个参数,根据什么查的参数 * */ Cursor cursor1 = getContentResolver().query(uri1,new String[]{"data1","mimetype"},"raw_contact_id=?",new String[]{contacts_id},null); while (cursor1.moveToNext()){ String data1 = cursor1.getString(0); String mimetype = cursor1.getString(1); //System.out.println("data1:"+data1+"--"+"mimetype:"+mimetype); if (mimetype.equals("vnd.android.cursor.item/name")){ name = data1; }else if (mimetype.equals("vnd.android.cursor.item/phone_v2")){ phone = data1; }else if (mimetype.equals("vnd.android.cursor.item/email_v2")){ eMail = data1; } } System.out.println("name:"+name+"- phone:"+phone+" -email:"+eMail); } } }
记得加权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
从代码中,我们可以看的很清楚,先获取raw_contact_id,然后通过他,获取data1和mimetype,然后通过mimetype知道data1中的数据是name、phone或者email。
ps:其实解析data表就是解析view_data
下面是插入联系人:
看代码:
public void insertContacts(){ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri uri1 = Uri.parse("content://com.android.contacts/data"); Cursor cursor = getContentResolver().query(uri,null,null,null,null); int count = cursor.getCount(); int count_id = count+1; ContentValues values = new ContentValues(); values.put("contact_id",count_id); getContentResolver().insert(uri,values); ContentValues contactValue = new ContentValues(); contactValue.put("data1","张三"); contactValue.put("raw_contact_id",count_id); contactValue.put("mimetype","vnd.android.cursor.item/name"); getContentResolver().insert(uri1,contactValue); contactValue.clear();//插完之后记得clear contactValue.put("data1","133333333"); contactValue.put("raw_contact_id",count_id); contactValue.put("mimetype","vnd.android.cursor.item/phone_v2"); getContentResolver().insert(uri1,contactValue); contactValue.clear(); contactValue.put("data1","478569@qq.com"); contactValue.put("raw_contact_id",count_id); contactValue.put("mimetype","vnd.android.cursor.item/email_v2"); getContentResolver().insert(uri1,contactValue); contactValue.clear(); }
基本思路,先从raw_contact表中获取当前联系人的个数,然后在加上1之后插入联系人,