閱讀254 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 十款最佳輕量級故障排查工具匯總
  下一篇:go escape加號被過濾解決方法