1. 程式人生 > >Android手機通訊錄的讀取、新增、刪除、查詢

Android手機通訊錄的讀取、新增、刪除、查詢

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獲取該聯絡人的各資料了。

      
  1. private
    void queryContacts() {  
  2.         // 獲取用來操作資料的類的物件,對聯絡人的基本操作都是使用這個物件
  3.         ContentResolver cr = getContentResolver();  
  4.         // 查詢contacts表的所有記錄
  5.         Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,  
  6.                 nullnullnull);  
  7.         // 如果記錄不為空
  8.         if (cursor.getCount() > 0) {  
  9.             // 遊標初始指向查詢結果的第一條記錄的上方,執行moveToNext函式會判斷
  10.             // 下一條記錄是否存在,如果存在,指向下一條記錄。否則,返回false。
  11.             while (cursor.moveToNext()) {  
  12.                 String rawContactId = "";  
  13.                 // 從Contacts表當中取得ContactId
  14.                 String id = cursor.getString(cursor  
  15.                         .getColumnIndex(ContactsContract.Contacts._ID));  
  16.                 Log.v("contactID", id);  
  17.                 // 獲取RawContacts表的遊標
  18.                 Cursor rawContactCur = cr.query(RawContacts.CONTENT_URI, null,  
  19.                         RawContacts._ID + "=?"new String[] { id }, null);  
  20.                 // 該查詢結果一般只返回一條記錄,所以我們直接讓遊標指向第一條記錄
  21.                 if (rawContactCur.moveToFirst()) {  
  22.                     // 讀取第一條記錄的RawContacts._ID列的值
  23.                     rawContactId = rawContactCur.getString(rawContactCur  
  24.                             .getColumnIndex(RawContacts._ID));  
  25.                     Log.v("rawContactID", rawContactId);  
  26.                 }  
  27.                 // 關閉遊標
  28.                 rawContactCur.close();  
  29.                 // 讀取號碼
  30.                 if (Integer  
  31.                         .parseInt(cursor.getString(cursor  
  32.                                 .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {  
  33.                     // 根據查詢RAW_CONTACT_ID查詢該聯絡人的號碼
  34.                     Cursor phoneCur = cr  
  35.                             .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,  
  36.                                     null,  
  37.                                     ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID  
  38.                                             + "=?",  
  39.                                     new String[] { rawContactId }, null);  
  40.                     // 上面的ContactsContract.CommonDataKinds.Phone.CONTENT_URI
  41.                     // 可以用下面的phoneUri代替
  42.                     // Uri
  43.                     // phoneUri=Uri.parse("content://com.android.contacts/data/phones");
  44.                     // 一個聯絡人可能有多個號碼,需要遍歷
  45.                     while (phoneCur.moveToNext()) {  
  46.                         // 獲取號碼
  47.                         String number = phoneCur  
  48.                                 .getString(phoneCur  
  49.                                         .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));  
  50.                         Log.v("number", number);  
  51.                         // 獲取號碼型別
  52.                         String type = phoneCur  
  53.                                 .getString(phoneCur  
  54.                                         .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));  
  55.                         Log.v("type", type);  
  56.                     }  
  57.                     phoneCur.close();  
  58.                 }  
  59.             }  
  60.             cursor.close();  
  61.         }  
  62.     }  

新建聯絡人

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

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

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

  1. publicvoid addContact(String name, String phoneNum) {  
  2.         ContentValues values = new ContentValues();  
  3.         Uri rawContactUri = getContentResolver().insert(  
  4.                 RawContacts.CONTENT_URI, values);  
  5.         long rawContactId = ContentUris.parseId(rawContactUri);  
  6.         // 向data表插入資料
  7.         if (name != "") {  
  8.             values.clear();  
  9.             values.put(Data.RAW_CONTACT_ID, rawContactId);  
  10.             values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);  
  11.             values.put(StructuredName.GIVEN_NAME, name);  
  12.             getContentResolver().insert(ContactsContract.Data.CONTENT_URI,  
  13.                     values);  
  14.         }  
  15.         // 向data表插入電話號碼
  16.         if (phoneNum != "") {  
  17.             values.clear();  
  18.             values.put(Data.RAW_CONTACT_ID, rawContactId);  
  19.             values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);  
  20.             values.put(Phone.NUMBER, phoneNum);  
  21.             values.put(Phone.TYPE, Phone.TYPE_MOBILE);  
  22.             getContentResolver().insert(ContactsContract.Data.CONTENT_URI,  
  23.                     values);  
  24.         }  
  25.     }  

刪除聯絡人

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

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

  1. // 刪除聯絡人
  2.     publicvoid deleteContact(long rawContactId) {  
  3.         getContentResolver().delete(  
  4.                 ContentUris.withAppendedId(RawContacts.CONTENT_URI,  
  5.                         rawContactId), nullnull);  
  6.     }  

更新聯絡人

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

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

相關推薦

Android手機通訊錄讀取新增刪除查詢

Android聯絡人資料庫檔案(contact2.db) 有研究過手機通訊錄資料的童鞋肯定知道一個數據庫檔案:目前是contact2.db(哥的手機是Android4.04的) 在此路徑下可以找到:/data/data/com.android.providers.c

MySQL索引操作:建立新增刪除索引

如果對索引的作用不太瞭解的建議先閱讀上一篇博文:MySQL索引的作用和分類介紹 建立索引 建立表的時候建立索引 格式: CREATE TABLE 表名[欄位名 欄位型別] [UNIQUE|FULLTEXT|SPATIAL|...] [INDEX|K

MySQL中外來鍵的定義作用新增刪除

1 簡介 在實際開發的專案中,一個健壯資料庫中的資料一定有很好的參照完整性。例如學生檔案和成績單兩張表,如果成績單中有張三的成績,學生檔案中張三的檔案卻被刪除了,這樣就會產生垃圾資料或者錯誤資料。為了保證資料的完整性,將兩張表之間的資料建立關係,因此就需要在成績

SQL_3th_T-SQL語句建立和刪除資料庫新增刪除約束

在SQL Server 2008 R2中點選新建查詢,輸入如下程式碼,選中程式碼段,並點選執行,就能執行選中區域程式碼: --使用數T-SQL語句來建立資料庫 create database Students on ( name='Students', --這是資料檔案的邏

Android 手機適配劉海(華為vivo)

直接開始。 先看下鴻陽公眾號的上面文章:可以關注他,這裡只是方便自己記錄一下。 Android 劉海屏適配方案 一、vivo的劉海適配直接官方文件 (長螢幕) google 適配全面屏要求,必須在AndroidManifest.xml宣告一下meta-data,應用下可以全屏

Android 手機通訊錄開發時給聯絡人新增頭像失敗的坑

在給聯絡人新增頭像程式碼 Bitmap photo = ...; // 將 Bitmap 轉為 byte[] byte[] bytes = LshImageUtils.bitmap2Bytes(photo); // 新增聯絡人, 插入名字和頭像 (LshC

如何向android手機通訊錄新增聯絡人

直接在手機的通訊錄的資料庫中新增列表 相關程式碼如下 package com.example.test; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import

在arcgis中提取新增刪除Shape檔案Z值

一、問題描述 有一批3d模型沒有高程值;在BS平臺上預覽顯示這些模型插入地下去了;預覽效果非常差,因為Z值為都是0; 由於平臺讀取資料是geometry的Z值欄位,而不是重新建一個欄位,所以要改寫ge

Android手機SD卡檔案或目錄拷貝複製貼上功能實現程式碼

package com.copy.file; /** * @author wainiwann * Android SD卡檔案目錄拷貝操作 * */ import java.io.File; import java.io.FileInputStream; import ja

Android中如何給TextView新增下劃線設定不同字型和顏色

一、如何給TextView新增下劃線以及點選跳轉 String txt = "點選跳轉到百度"; SpannableString spannableString = new Span

python學習——修改新增刪除元素

在上週簡要的學習了一下python列表的一些操作,並做了做《python程式設計——從入門到實踐》第三章的一些例題。3-1、3-2names=['tony','tom','marry'] print(names[0]) print(names[1]) print(names[

面試題9:數組堆化堆的插入堆的刪除堆排序

art 面試 rewind 刪除 test from minimum 面試題 排序 參考:白話經典算法系列之七 堆與堆排序 1 #include <iostream> 2 #include <climits> 3 #include <v

SQL SERVER 新增新增字段修改字段 判斷表是否存在

相關信息 not null record begin hist char use size content // 新增之前判斷表是否存在 IF NOT EXISTS (SELECT NAME FROM SYSOBJECTS WHERE ID = OBJECT_ID(‘t

演算法導論 第十二章:二叉查詢樹 筆記(二叉查詢查詢二叉查詢插入和刪除隨機構造的二叉查詢樹)

二叉查詢樹是一種樹資料結構,它與普通的二叉樹最大的不同就是二叉查詢樹滿足一個性質:對於樹中的任意一個節點,均有其左子樹中的所有節點的關鍵字值都不大於該節點的關鍵字值,其右子樹中的任意一個節點的關鍵字值都不小於該節點的關鍵字值。 在二叉查詢樹上可以進行搜尋、取最小值、取最大值、取指定節點的前驅

第一次嘗試用BaseRecyclerViewAdapterHelper實現上拉重新整理載入更多新增頭佈局尾佈局等等功能

BaseRecyclerViewAdapterHelper 簡介: 減少重複 Adapter 程式碼 新增 Item 的點選事件,長按事件以及子控制元件的點選事件 新增頭部、尾部,下拉重新整理、上拉載入(上拉載入的5種載入更多動畫任你選擇,後期會新增更多的載入動畫)、沒有更多

C++類中單鏈表的實現(頭插尾插頭刪尾刪指定位置插入指定位置刪除連結串列長度清空連結串列連結串列排序)

#include<iostream> using namespace std; class Node { public:Node():next(NULL){}Node(int n,Node *p = NULL):value(n),next(p){}int val

table表格的相關設定(邊框合併隔行變色新增內邊框單獨設定某一列)

1、為table表格設定邊框合併 table{     border-collapse:collapse;     border-spacing:0; } 2、隔行變色和新增內邊框 function addColor() {     var tbodyTrList = $(

Notification(Notification的通知欄常駐各種樣式點選無效禁止滑動刪除相容低版本)

Notification(Notification的通知欄常駐、Notification的各種樣式、Notification點選無效、Notification禁止滑動刪除) Android的Notification是android系統中很重要的一個機制, 產品人員常常利用通

Linux筆記:禁止root賬號遠端登入新增swap分割槽修改ulimit

新裝ubuntu需要執行的幾個操作:1.修改sshd預設埠,禁止root登入sudo vi /etc/ssh/sshd_config將PermitRootLogin 設定為No      --表示禁止root遠端登入將Port 修改為2222sudo service sshd

Scala——類的定義重新實現toString方法檢查先決條件新增欄位私有方法自指向輔助構造器操作符過載隱式轉換

/** * Created by jiaoshuhai on 2018/4/23. *///類的建立class Rational(n:Int,d:Int){//類引數,oject無引數  //檢察先決條件  require(d != 0)  private def gcd(a : Int ,b :Int) :