Android是将联系人信息存储在Sqlite数据库中的,如果想知道Sqlite的详细信息可以参考http://www.cnblogs.com/luxiaofeng54/archive/2011/03/15/1985183.html这篇文章。
首先,看一下联系人表contacts
这张图中的内容就是contacts表的内容,其中我们常用的有_id和display_name。
在Andriod中提供了获取这一信息的接口Resolver,通过Resolver可以对共享的内容进行解读。Resolver可以理解为内容解析器。
其代码实现如下:
<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)有五个参数
第一个参数uri,Uri是Provide的标识,这里指联系人这个Provide的标识。android.provider.ContactsContract.Contacts.CONTENT_URI就是提供联系人的内容提供者
第二个参数projection,这个参数告诉Provider要返回的内容(列Column),比如Contacts Provider提供了联系人的ID和联系人的NAME等内容,如果我们只需要NAME,那么我们就应该使用new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}。用null表示返回Provider的所有内容(列Column)。
第三个参数selection,设置条件,相当于SQL语句中的where。null表示不进行筛选。如果我们只想返回名称为张三的数据,第三个参数应该设置为:android.provider.ContactsContract.Contacts.DISPLAY_NAME + "='张三'"
第四个参数selectionArgs,这个参数是要配合第三个参数使用的,如果你在第三个参数里面有?(android.provider.ContactsContract.Contacts.DISPLAY_NAME + "=?"),那么你在selectionArgs写的数据就会替换掉?(new String[]{"张三"})。
第五个参数,sortOrder,按照什么进行排序,相当于SQL语句中的Order by。
下面再看一下联系人表data
其中mimetype_id列的内容如下:
从表data可以看出,name,phone number,email存储的方式是一样的,都是data1,后面的data是更详细的信息,区分name,phone number,email 的唯一方式是mimetype_id,区分联系人的唯一标识是raw_contact_id,这个值是从上面的表contacts的_id获取的。所以要想获取联系人的所有信息,需要先通过contacts表获取联系人ID,然后根据联系人的ID在表data获取想要的内容。
下面是获取联系人详细信息的源码:
<pre>
public void fetchContactInformation() {
String id;
String mimetype;
ContentResolver contentResolver = this.getContentResolver();
//只需要从Contacts中获取ID,其他的都可以不要,通过查看上面编译后的SQL语句,可以看出将第二个参数
//设置成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>