Android下ContactsContract類詳解
阿新 • • 發佈:2019-01-08
在android4.0之後的版本,聯絡人的資訊有ContactsContract這樣一個類來管理。這個類的結構比較複雜,所以有必要分析一下。官方對ContactsContract的定義是:一個儲存有聯絡人相關資訊的可以擴充套件的資料庫。該資料庫的結構分為三層:
這一段程式碼是在OnActivityResult()中執行的,也就是呼叫完聯絡人程式之後返回後執行的函式。通過返回的資料uri進行查詢得到cursor所指向的資料並得到該使用者的ID。我們的目的是得到該使用者的電話號碼,所以應該是利用使用者的ID去獲得使用者的號碼。但是使用者的號碼並不在result所指向的表中,而是在ContactsContract.CommonDataKinds.Phone.CONTENT_URI所指向的表中。所以就要對該表進行查詢,並且Phone下的CONTACT_ID與Contact下的_ID是同義的。所以可以設定where語句為:CONTACT_ID=id來得到所求的電話號碼。
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等。
下面以一個讀取聯絡人資訊的程式片段來說明該類的使用:
以上程式碼呼叫程式自帶的讀取聯絡人資訊程式。其中setData為ContactsContract.Contacts.CONTENT_URI,表示將資料指向了聯絡人資訊。private void toGetContact() { Intent intent=new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setData(ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent,this.GET_CONTACT); }
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來得到所求的電話號碼。