1. 程式人生 > >Android下ContactsContract類詳解

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來得到所求的電話號碼。