Android是將聯(lián)系人信息存儲在Sqlite數(shù)據(jù)庫中的讥此,如果想知道Sqlite的詳細信息可以參考http://www.cnblogs.com/luxiaofeng54/archive/2011/03/15/1985183.html這篇文章砚著。
首先狸捅,看一下聯(lián)系人表contacts
這張圖中的內(nèi)容就是contacts表的內(nèi)容,其中我們常用的有_id和display_name撮竿。
在Andriod中提供了獲取這一信息的接口Resolver只恨,通過Resolver可以對共享的內(nèi)容進行解讀运怖。Resolver可以理解為內(nèi)容解析器。
其代碼實現(xiàn)如下:
<pre>
ContentResolver contentResolver = this.getContentResolver();
Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null, null, null)
</pre>
public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)有五個參數(shù)
第一個參數(shù)uri搀矫,Uri是Provide的標識抹沪,這里指聯(lián)系人這個Provide的標識。android.provider.ContactsContract.Contacts.CONTENT_URI就是提供聯(lián)系人的內(nèi)容提供者
第二個參數(shù)projection瓤球,這個參數(shù)告訴Provider要返回的內(nèi)容(列Column)融欧,比如Contacts Provider提供了聯(lián)系人的ID和聯(lián)系人的NAME等內(nèi)容,如果我們只需要NAME卦羡,那么我們就應該使用new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}噪馏。用null表示返回Provider的所有內(nèi)容(列Column)。
第三個參數(shù)selection绿饵,設置條件欠肾,相當于SQL語句中的where。null表示不進行篩選蝴罪。如果我們只想返回名稱為張三的數(shù)據(jù)董济,第三個參數(shù)應該設置為:android.provider.ContactsContract.Contacts.DISPLAY_NAME + "='張三'"
第四個參數(shù)selectionArgs,這個參數(shù)是要配合第三個參數(shù)使用的要门,如果你在第三個參數(shù)里面有虏肾?(android.provider.ContactsContract.Contacts.DISPLAY_NAME + "=?")廓啊,那么你在selectionArgs寫的數(shù)據(jù)就會替換掉?(new String[]{"張三"})封豪。
第五個參數(shù)谴轮,sortOrder,按照什么進行排序吹埠,相當于SQL語句中的Order by第步。
下面再看一下聯(lián)系人表data
其中mimetype_id列的內(nèi)容如下:
從表data可以看出,name缘琅,phone number粘都,email存儲的方式是一樣的,都是data1刷袍,后面的data是更詳細的信息翩隧,區(qū)分name,phone number呻纹,email 的唯一方式是mimetype_id堆生,區(qū)分聯(lián)系人的唯一標識是raw_contact_id,這個值是從上面的表contacts的_id獲取的雷酪。所以要想獲取聯(lián)系人的所有信息淑仆,需要先通過contacts表獲取聯(lián)系人ID,然后根據(jù)聯(lián)系人的ID在表data獲取想要的內(nèi)容哥力。
下面是獲取聯(lián)系人詳細信息的源碼:
<pre>
public void fetchContactInformation() {
String id;
String mimetype;
ContentResolver contentResolver = this.getContentResolver();
//只需要從Contacts中獲取ID蔗怠,其他的都可以不要,通過查看上面編譯后的SQL語句省骂,可以看出將第二個參數(shù)
//設置成null蟀淮,默認返回的列非常多,是一種資源浪費钞澳。
Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
new String[]{android.provider.ContactsContract.Contacts._ID}, null, null, null);
while(cursor.moveToNext()) {
id=cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));
//從一個Cursor獲取所有的信息
Cursor contactInfoCursor = contentResolver.query(
android.provider.ContactsContract.Data.CONTENT_URI,
new String[]{android.provider.ContactsContract.Data.CONTACT_ID,
android.provider.ContactsContract.Data.MIMETYPE,
android.provider.ContactsContract.Data.DATA1
},
android.provider.ContactsContract.Data.CONTACT_ID+"="+id, null, null);
while(contactInfoCursor.moveToNext()) {
mimetype = contactInfoCursor.getString(
contactInfoCursor.getColumnIndex(android.provider.ContactsContract.Data.MIMETYPE));
String value = contactInfoCursor.getString(
contactInfoCursor.getColumnIndex(android.provider.ContactsContract.Data.DATA1));
if(mimetype.contains("/name")){
System.out.println("姓名="+value);
} else if(mimetype.contains("/im")){
System.out.println("聊天(QQ)賬號="+value);
} else if(mimetype.contains("/email")) {
System.out.println("郵箱="+value);
} else if(mimetype.contains("/phone")) {
System.out.println("電話="+value);
} else if(mimetype.contains("/postal")) {
System.out.println("郵編="+value);
} else if(mimetype.contains("/photo")) {
System.out.println("照片="+value);
} else if(mimetype.contains("/group")) {
System.out.println("組="+value);
}
}
System.out.println("*********");
contactInfoCursor.close();
}
cursor.close();
}
</pre>