天天看點

Android讀取、加入聯系人

android系統中的聯系人也是通過contentprovider來對外提供資料的,我們這裡實作擷取所有聯系人、通過電話号碼擷取聯系人、添加聯系人、使用事務添加聯系人。

擷取所有聯系人

1. android系統中的聯系人也是通過contentprovider來對外提供資料的

2. 資料庫路徑為:/data/data/com.android.providers.contacts/database/contacts2.db

3. 我們需要關注的有3張表

raw_contacts:其中儲存了聯系人id

data:和raw_contacts是多對一的關系,儲存了聯系人的各項資料

mimetypes:為資料類型

4. provider的authorites為com.android.contacts

5. 查詢raw_contacts表的路徑為:contacts

6. 查詢data表的路徑為:contacts/#/data

這個路徑為連接配接查詢,要查詢“mimetype”字段可以根據“mimetype_id”查詢到mimetypes表中的資料

7. 先查詢raw_contacts得到每個聯系人的id,在使用id從data表中查詢對應資料,根據mimetype分類資料

示例:

         //查詢所有聯系人  

    public void testgetall() {  

    contentresolver resolver = getcontext().getcontentresolver();  

    uri uri = uri.parse("content://com.android.contacts/contacts");  

    cursor idcursor = resolver.query(uri, new string[] { "_id" }, null, null, null);  

    while (idcursor.movetonext()) {  

        //擷取到raw_contacts表中的id  

        int id = idcursor.getint(0);   

        //根據擷取到的id查詢data表中的資料  

       uri = uri.parse("content://com.android.contacts/contacts/" + id + "/data");  

        cursor datacursor = resolver.query(uri, new string[] { "data1", "mimetype" }, null, null, null);  

        stringbuilder sb = new stringbuilder();  

        sb.append("id=" + id);  

        //查詢聯系人表中的  

        while (datacursor.movetonext()) {  

            string data = datacursor.getstring(0);  

            string type = datacursor.getstring(1);  

          if ("vnd.android.cursor.item/name".equals(type))  

                sb.append(", name=" + data);  

           else if ("vnd.android.cursor.item/phone_v2".equals(type))  

               sb.append(", phone=" + data);  

            else if ("vnd.android.cursor.item/email_v2".equals(type))  

                sb.append(", email=" + data);  

        }  

        system.out.println(sb);  

    }  

通過電話号碼擷取聯系人

1. 系統内部提供了根據電話号碼擷取data表資料的功能,路徑為:data/phones/filter/*

2. 用電話号碼替換“*”部分就可以查到所需資料,擷取“display_name”可以擷取到聯系人顯示名

        //根據電話号碼查詢聯系人名稱  

  public void testgetname() {  

    uri uri = uri.parse("content://com.android.contacts/data/phones/filter/1111");  

    cursor c = resolver.query(uri, new string[] { "display_name" }, null, null, null);  

    while (c.movetonext()) {  

        system.out.println(c.getstring(0));  

添加聯系人

1. 先向raw_contacts表插入id,路徑為:raw_contacts

2. 得到id之後再向data表插入資料,路徑為:data

       //添加聯系人  

  ublic void testinsert() {  

 contentresolver resolver = getcontext().getcontentresolver();  

uri uri = uri.parse("content://com.android.contacts/raw_contacts");  

contentvalues values = new contentvalues();  

// 向raw_contacts插入一條除了id之外, 其他全部為null的記錄, id是自動生成的  

long id = contenturis.parseid(resolver.insert(uri, values));   

//添加聯系人姓名  

uri = uri.parse("content://com.android.contacts/data");  

values.put("raw_contact_id", id);  

values.put("data2", "fhm");  

values.put("mimetype", "vnd.android.cursor.item/name");  

resolver.insert(uri, values);  

                //添加聯系人電話  

values.clear(); // 清空上次的資料  

values.put("data1", "18600000000");  

values.put("data2", "2");  

values.put("mimetype", "vnd.android.cursor.item/phone_v2");  

//添加聯系人郵箱  

values.clear();  

values.put("data2", "1");  

values.put("mimetype", "vnd.android.cursor.item/email_v2");  

使用事務添加聯系人

1. 在添加聯系人得時候是分多次通路provider,如果在過程中出現異常,會出現資料不完整的情況,這些操作應該放在一次事務中

2. 使用contentresolver的applybatch(string authority,arraylist<contentprovideroperation> operations) 方法可以将多個操作在一個事務中執行

        //使用事務添加聯系人  

public void testinsertbatch() throws exception {  

    arraylist<contentprovideroperation> operations = new arraylist<contentprovideroperation>();  

    contentprovideroperation operation1 = contentprovideroperation //  

            .newinsert(uri.parse("content://com.android.contacts/raw_contacts")) //  

            .withvalue("_id", null) //  

            .build();  

    operations.add(operation1);  

    contentprovideroperation operation2 = contentprovideroperation //  

            .newinsert(uri.parse("content://com.android.contacts/data")) //  

            .withvaluebackreference("raw_contact_id", 0) //  

            .withvalue("data2", "zzh") //  

            .withvalue("mimetype", "vnd.android.cursor.item/name") //  

    operations.add(operation2);  

    contentprovideroperation operation3 = contentprovideroperation //  

            .withvalue("data1", "18612312312") //  

            .withvalue("data2", "2") //  

            .withvalue("mimetype", "vnd.android.cursor.item/phone_v2") //  

    operations.add(operation3);  

    contentprovideroperation operation4 = contentprovideroperation //  

            .withvalue("mimetype", "vnd.android.cursor.item/email_v2") //  

    operations.add(operation4);  

    // 在事務中對多個操作批量執行  

    resolver.applybatch("com.android.contacts", operations);  

轉自:http://blog.csdn.net/chaoyu168/article/details/48969257