1. 程式人生 > >android從零單排之手機通訊錄的讀取、新增、刪除、查詢

android從零單排之手機通訊錄的讀取、新增、刪除、查詢

工作中牽扯到了對android手機通訊錄的系列操作,網上查找了好多資料,大多數都介紹的是模模糊糊,終於找到了一篇靠譜的,於是摘抄下來,大家共同學習:</span>

Android聯絡人資料庫檔案(contact2.db)

有研究過手機通訊錄資料的童鞋肯定知道一個數據庫檔案:目前是contact2.db(哥的手機是Android4.04的)

在此路徑下可以找到:/data/data/com.android.providers.contacts/databases/contact2.db

將其匯入視覺化資料庫管理器當中(我這裡用的是SQLiteDatabase Browser)

\

有以上那麼多張表,看到頭暈的有木有,我們主要關注一些比較重要的表就行了。

以上我用紅框標誌的是比較重要的幾個表:

1、contacts表

該表儲存了所有的手機測聯絡人,每個聯絡人佔一行,該表儲存了聯絡人的ContactID、聯絡次數、最後一次聯絡的時間、是否含有號碼、是否被新增到收藏夾等資訊。

2、raw_contacts表

該表儲存了所有建立過的手機測聯絡人,每個聯絡人佔一行,表裡有一列標識該聯絡人是否被刪除,該表儲存了兩個ID: RawContactID和ContactID,從而將contacts表和raw_contacts表聯絡起來。該表儲存了聯絡人的RawContactID、ContactID、聯絡次數、最後一次聯絡的時間、是否被新增到收藏夾、顯示的名字、用於排序的漢語拼音等資訊。

3、 mimetypes 表

   該表定義了所有的MimeTypeID,即聯絡人的各個欄位的唯一標誌。

\

4、data表

? 該表儲存了所有建立過的手機測聯絡人的所有資訊,每個欄位佔一行 ,該表儲存了兩個ID: MimeTypeID和RawContactID,從而將data表和raw_contacts表聯絡起來。

? 聯絡人的所有資訊儲存在列data1至data15中,各列中儲存的內容根據MimeTypeID的不同而不同。如儲存號碼(MimeTypeID=5)的那行資料中,data1列儲存號碼,data2列儲存號碼型別(手機號碼/家庭號碼/工作號碼等)。

\

對聯絡人的基本操作(增刪改查)

許可權設定

讀取聯絡人

分為以下步驟:

1、先讀取contacts表,獲取ContactsID;

2、再在raw_contacts表中根據ContactsID獲取RawContactsID;

3、然後就可以在data表中根據RawContactsID獲取該聯絡人的各資料了。

      
private void queryContacts() {
        // 獲取用來操作資料的類的物件,對聯絡人的基本操作都是使用這個物件
        ContentResolver cr = getContentResolver();
        // 查詢contacts表的所有記錄
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
                null, null, null);
        // 如果記錄不為空
        if (cursor.getCount() > 0) {
            // 遊標初始指向查詢結果的第一條記錄的上方,執行moveToNext函式會判斷
            // 下一條記錄是否存在,如果存在,指向下一條記錄。否則,返回false。
            while (cursor.moveToNext()) {
                String rawContactId = "";
                // 從Contacts表當中取得ContactId
                String id = cursor.getString(cursor
                        .getColumnIndex(ContactsContract.Contacts._ID));
                Log.v("contactID", id);
 
                // 獲取RawContacts表的遊標
                Cursor rawContactCur = cr.query(RawContacts.CONTENT_URI, null,
                        RawContacts._ID + "=?", new String[] { id }, null);
                // 該查詢結果一般只返回一條記錄,所以我們直接讓遊標指向第一條記錄
                if (rawContactCur.moveToFirst()) {
                    // 讀取第一條記錄的RawContacts._ID列的值
                    rawContactId = rawContactCur.getString(rawContactCur
                            .getColumnIndex(RawContacts._ID));
                    Log.v("rawContactID", rawContactId);
 
                }
                // 關閉遊標
                rawContactCur.close();
                // 讀取號碼
                if (Integer
                        .parseInt(cursor.getString(cursor
                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    // 根據查詢RAW_CONTACT_ID查詢該聯絡人的號碼
                    Cursor phoneCur = cr
                            .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                    null,
                                    ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID
                                            + "=?",
                                    new String[] { rawContactId }, null);
                    // 上面的ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                    // 可以用下面的phoneUri代替
                    // Uri
                    // phoneUri=Uri.parse("content://com.android.contacts/data/phones");
 
                    // 一個聯絡人可能有多個號碼,需要遍歷
                    while (phoneCur.moveToNext()) {
                        // 獲取號碼
                        String number = phoneCur
                                .getString(phoneCur
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        Log.v("number", number);
                        // 獲取號碼型別
                        String type = phoneCur
                                .getString(phoneCur
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                        Log.v("type", type);
 
                    }
                    phoneCur.close();
 
                }
            }
            cursor.close();
        }
    }

新建聯絡人

新建聯絡人時, 根據contacts、raw_ contacts兩張表中ID的使用情況,自動生成ContactID和RawContactID。

Android原始碼新建重複姓名的聯絡人的ContactID是不重複的,所以會重複顯示。

用下面的程式碼新建聯絡人,如果多次新建的聯絡人的姓名是一樣的,生成的ContactID也會重複, RawContactID不會重複,我們在讀取聯絡人的時候可以獲取所有同姓名聯絡人的號碼等資訊,在顯示聯絡人的時候,重複姓名的聯絡人的所有欄位資訊都會合並起來顯示為一個聯絡人。

public void addContact(String name, String phoneNum) {
        ContentValues values = new ContentValues();
        Uri rawContactUri = getContentResolver().insert(
                RawContacts.CONTENT_URI, values);
        long rawContactId = ContentUris.parseId(rawContactUri);
        // 向data表插入資料
        if (name != "") {
            values.clear();
            values.put(Data.RAW_CONTACT_ID, rawContactId);
            values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
            values.put(StructuredName.GIVEN_NAME, name);
            getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
                    values);
        }
        // 向data表插入電話號碼
        if (phoneNum != "") {
            values.clear();
            values.put(Data.RAW_CONTACT_ID, rawContactId);
            values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
            values.put(Phone.NUMBER, phoneNum);
            values.put(Phone.TYPE, Phone.TYPE_MOBILE);
            getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
                    values);
        }
    }

刪除聯絡人

Android幫助文件:When a raw contact is deleted, all of its Data rows as well asStatusUpdates, AggregationExceptions, PhoneLookup rows are deleted automatically.

所以,要刪除聯絡人,我們只需要將raw_contacts表中指定RawContactID的行刪除,其他表中與之關聯的資料都會自動刪除。

// 刪除聯絡人
    public void deleteContact(long rawContactId) {
        getContentResolver().delete(
                ContentUris.withAppendedId(RawContacts.CONTENT_URI,
                        rawContactId), null, null);
    }

更新聯絡人

聯絡人的所有資訊都是儲存在data表中,所以要更新聯絡人,我們只需要根據RawContactID和MIMETYPE修改data表中的內容。

  
// 更新聯絡人
    public void updataCotact(long rawContactId) {
        ContentValues values = new ContentValues();
        values.put(Phone.NUMBER, "13800138000");
        values.put(Phone.TYPE, Phone.TYPE_MOBILE);
        String where = ContactsContract.Data.RAW_CONTACT_ID + "=? AND "
                + ContactsContract.Data.MIMETYPE + "=?";
        String[] selectionArgs = new String[] { String.valueOf(rawContactId),
                Phone.CONTENT_ITEM_TYPE };
        getContentResolver().update(ContactsContract.Data.CONTENT_URI, values,
                where, selectionArgs);
    }
   以上就是本篇部落格的所有內容,不知道小巫說清楚了沒有?關於Android相關的知識點,還是需要多查資料和總結才能比較熟悉,檢視官方文件是最直接的方式,如果閱讀全英文有困難的話就看看別人總結的東西吧。