要注意的是联系人的姓名和电话号码不在同一个URI中。
姓名所在URI: android.provider.ContactsContract.Contacts.CONTENT_URI
电话所在URI:android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_URI
public class ContactActivity extends ListActivity {
private ContentResolver resolver ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
resolver = getContentResolver() ;
}
@Override
protected void onResume() {
super.onResume();
/* 1.URI
* 2.投影:数据库中其中的几个列(null查询全部的)
* 3.条件
* 4.参数
* 5.排序
*/
//联系人的ID,联系人的姓名
String projection[]={Contacts._ID,Contacts.DISPLAY_NAME};
Cursor infoCursor = resolver.query(Contacts.CONTENT_URI, projection, null, null, null) ;
//电话的ID,电话对应的联系人ID,电话号码的具体内容
String [] column ={Phone._ID,Phone.CONTACT_ID,Phone.DATA} ;
final Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,
column,null, null,null);
@SuppressWarnings("deprecation")
CursorAdapter adapter = new CursorAdapter(this,infoCursor) {
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
//导入自定义的XML文件
View view = getLayoutInflater().inflate(R.layout.contacts_item, null) ;
Holder holder = new Holder();
holder.idTv = (TextView) view.findViewById(R.id.id_tv) ;
holder.nameTv = (TextView) view.findViewById(R.id.name_tv) ;
holder.phoneTv = (TextView) view.findViewById(R.id.phone_tv) ;
view.setTag(holder);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
Holder holder = (Holder) view.getTag() ;
int contactId = cursor.getInt(0) ;
holder.idTv.setText(cursor.getString(0));
holder.nameTv.setText(cursor.getString(1));
StringBuffer sb = new StringBuffer() ;
/*
* 列出所有的电话号码,有的联系人有多个号码
*/
//有数据时一直是true,cursor第一次指向第一条数据之前,后面都是指向最后一条数据之后,执行moveToFirst都是true
if(phoneCursor.moveToFirst()){
do{
int pid = phoneCursor.getInt(1) ;
//联系人ID等于电话号码对应的联系人ID
if(pid == contactId){
sb.append(phoneCursor.getString(2)).append(" ") ;
}
}while(phoneCursor.moveToNext());//移到最后时退出循环
}
holder.phoneTv.setText(sb);
}
};
setListAdapter(adapter);
}
//内部类,所有的控件集合
class Holder {
TextView idTv ;
TextView nameTv ;
TextView phoneTv ;
}
}
查看虚拟机的联系人:
C:\>adb shell
cd /data/data
cd com.android.providers.contacts
cd databases
sqlite3 contact2.db
.tables
.headers on
.mode column
select * from data ;