Android下ContactsContract類詳解
在android4.0之後的版本,聯係人的信息有ContactsContract這樣一個類來管理。這個類的結構比較複雜,所以有必要分析一下。官方對ContactsContract的定義是:一個存儲有聯係人相關信息的可以擴展的數據庫。該數據庫的結構分為三層:
1、ConstractContact.data:該類可以存儲任何數據,裏麵的每一項都指向一條raw contact(後麵講),通常是用來存放一段聯係人信息,比如一個電話號碼或者是相關的元數據(metadata)。Data是一個可以盛放任何類型數據的通用表,每一行的數據類型有該行的MIMETYPE字段決定,並決定了對應的從DATA1到DATA15等字段的意義。比如,如果一行的類型為Phone.CONTENT_ITEM_TYPE,那麼該行的DATA1字段就存儲的是電話號碼;
2、ConstractContact.RawContacts:原始數據,每一行描述了一個人的相關信息,並與一個賬戶相關;
3、ConstractContact.Contacts:一條或多條RawContacts的集合,用於描述一個聯係人的相關信息。
data中的類型是可以擴展的,目前自帶的類型都在ConstractContact.CommonDataKind中。如Phone等。
下麵以一個讀取聯係人信息的程序片段來說明該類的使用:
private void toGetContact() { Intent intent=new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setData(ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent,this.GET_CONTACT); }以上代碼調用程序自帶的讀取聯係人信息程序。其中setData為ContactsContract.Contacts.CONTENT_URI,表示將數據指向了聯係人信息。
private String afterGetContact(Intent data) { if(data==null){ return null; } Uri result=data.getData(); Cursor cursor = getContentResolver().query(result, null, null, null, null); cursor.moveToFirst(); String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); Cursor phone=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",new String[]{id},null ); if(phone.moveToFirst()) { String phoneNum=phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); return phoneNum; } else { return null; } }
這一段代碼是在OnActivityResult()中執行的,也就是調用完聯係人程序之後返回後執行的函數。通過返回的數據uri進行查詢得到cursor所指向的數據並得到該用戶的ID。我們的目的是得到該用戶的電話號碼,所以應該是利用用戶的ID去獲得用戶的號碼。但是用戶的號碼並不在result所指向的表中,而是在ContactsContract.CommonDataKinds.Phone.CONTENT_URI所指向的表中。所以就要對該表進行查詢,並且Phone下的CONTACT_ID與Contact下的_ID是同義的。所以可以設置where語句為:CONTACT_ID=id來得到所求的電話號碼。
最後更新:2017-04-03 18:51:59