【达内课程】联系人项目(知识预热)

系列文章:

  1. 联系人项目(知识预热)
  2. 联系人项目(ViewPager和底部联动)
  3. 联系人项目(查询联系人数据)
  4. 联系人项目(显示联系人数据)
  5. 联系人项目(显示通话记录)
  6. 联系人项目(显示拨号界面)
  7. 联系人项目(短信显示)
  8. 联系人项目(短信详情显示)
  9. 联系人项目(总)

联系人表结构

首先在模拟机中添加几个联系人
在这里插入图片描述

然后打开Device File Exploer
data-data-com.android.providers.contacts下的databases文件夹
把contacts2.db导出,查看contacts表、data表、mimetypes表

联系人的信息操作前,必须把数据库的这3个表仔细看一下
contacts表
在这里插入图片描述

data表
在这里插入图片描述
mimetypes表
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

栗子:查询联系人数据

AndroidManifest.xml增加权限

 <uses-permission android:name="android.permission.READ_CONTACTS"/>

Contact类

public class Contact {
    private int id;
    private int photoId;
    private String name;
    private String email;
    private String phone;
    private String address;
   // 增加各个属性的set和get方法
   ......
   @Override
    public String toString() {
        return "Contact id:"+id+",\nPhoto id:"+photoId+",\nName:"+name+",\nEmail:"+email+",\nPhone:"+phone+",\nAddress:"+address;
    }
}

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_search;
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_search = findViewById(R.id.btn_search);
        listView = findViewById(R.id.listview);
        btn_search.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_search:
                List<Contact> list = loadContacts();
                Log.d("CONTACT", list.toString());

                ArrayAdapter<Contact> arrayAdapter = new ArrayAdapter<Contact>(this, android.R.layout.simple_list_item_1, list);
                listView.setAdapter(arrayAdapter);
                break;
        }
    }

    /**
     * 查询联系人
     * 先查contacts表,获取所有人id
     * 再查data表,通过id查询这个人的其他信息
     */
    private List<Contact> loadContacts() {
        ContentResolver r = getContentResolver();
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.PHOTO_ID
        };

        String[] column = {
                ContactsContract.Data._ID,//0
                ContactsContract.Data.MIMETYPE,//1
                ContactsContract.Data.DATA1//2
        };

        Cursor c = r.query(uri, projection, null, null, null);

        //准备集合
        List<Contact> contacts = new ArrayList<Contact>();

        while (c.moveToNext()) {
            Contact contact = new Contact();

            int id = c.getInt(0);
            int photo_id = c.getInt(1);

            contact.setId(id);
            contact.setPhotoId(photo_id);

            //通过id查data表,获取这个人的其他信息
            Uri dataUri = ContactsContract.Data.CONTENT_URI;
            Cursor c1 = r.query(dataUri, column, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[]{id + ""}, null);
            while (c1.moveToNext()) {
                int dataId = c1.getInt(0);
                String mm = c1.getString(1);
                String data1 = c1.getString(2);

                //data表里的字段是mimetype_id,而这里查询的是mimetype,返回的是字符串
                //通过contentprovider查到的就是字符串,拿不到id
                if (mm.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
                    //描述的是Email
                    contact.setEmail(data1);
                } else if (mm.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
                    //描述的是Phone
                    contact.setPhone(data1);
                } else if (mm.equals("vnd.android.cursor.item/name")) {
                    //描述的是Name
                    contact.setName(data1);
                } else if (mm.equals("vnd.android.cursor.item/sip_address")) {
                    //描述的是Address
                    contact.setAddress(data1);
                }
            }
            contacts.add(contact);
            c1.close();
        }
        c.close();
        return contacts;
    }
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值