ContentProvider列出联系人姓名,电话到ListActivity

要注意的是联系人的姓名和电话号码不在同一个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 ;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值