ContentProvider获取联系人信息

调用系统提供的ContentProvider

系统在写联系人这个APP的时候,就已经提供好了一个联系人的数据库和ContentProvider。




包括1.raw_contacts表



Contact_id存放联系人的id

该表保存了所有创建过的手机测联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,
从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添
加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

2.contacts表
该表保存了所有的手机测联系人,每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加
到收藏夹等信息。

3.data表


这个表用来储存所有的联系人的详细信息的

一个联系人的信息可能存在多条数据,其中比较重要的字段是数据类型,联系人id,还有数据内容,

其中有一个字段mime_type是数据类型(电话,邮箱,名字)


4.mimeType表

就是联系人所有的数据库类型选项


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

看源码可以看出ContentProvider有两个Uri,两个都可以用的,但是在4.0之后,只能用分号后的Uri,该路径向低版本兼容。

若要获取联系人的id:1.获取所有人的根据id查询到这个联系人的所有的数据信息

下面是读取联系人的实例

当人,提前要在AndroidManifest中注册

<uses-permission android:name="android.permission.READ_CONTACTS"/>
再在MainActivity里

private Button getContscts;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getContscts= (Button) findViewById(R.id.getContacts);
        getContscts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //在这里进行联系人的获取
                ContentResolver cr=getContentResolver();
                //1.获取所有的联系人id
                Cursor cursorID=cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),new String[]{"contact_id"},null,null,null);
                if (cursorID.getCount()==0){
                    Toast.makeText(MainActivity.this,"没有联系人",Toast.LENGTH_SHORT).show();
                    return;
                }
                    //根据ID获取到每一个联系人的所有信息
                while(cursorID.moveToNext()){
//                    拿到id的字符串
                    String contactid=cursorID.getString(cursorID.getColumnIndex("contact_id"));
//                    根据ID去data数据库里查询联系人的所有信息               "raw_contact_id=?":查询条件     new String[]{contactid}:找出的id
                    Cursor contactData=cr.query(Uri.parse("content://com.android.contacts/data"),new String[]{"data1","mimetype"},"raw_contact_id=?",new String[]{contactid},null);
//                遍历获取联系人的信息
                    while(contactData.moveToNext()){
//                        拿到数据内容
                        String data1=contactData.getString(contactData.getColumnIndex("data1"));
//                        拿到数据类型
                        String mimeType=contactData.getString(contactData.getColumnIndex("mimetype"));
                        if ("vnd.android.cursor.item/email_v2".equals(mimeType)){
                            Log.i("邮箱",data1);
                        }else if ("vnd.android.cursor.item/phone_v2".equals(mimeType)){
                            Log.i("电话",data1);
                        }else if ("vnd.android.cursor.item/name_v2".equals(mimeType)){
                            Log.i("名字",data1);
                        }
                    }
//                    关闭游标对象,关闭内存
                    contactData.close();
                }
//                关闭游标对象,关闭内存
                cursorID.close();
//                添加权限,允许读取ContentProvider
            }
        });
    }
}

运行,查看Log

插入联系人:

首先注册写入权限

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
如上,我们想插入联系人,就需要如下的操作:

1.先去raw_contacts表中添加id;

2.然后借助id去data表中添加各种信息。

               ContentResolver cr = getContentResolver();
//先查询raw_contacts表,获取最新联系人的主键,然后主键+1,就是要插入的联系人的id
                Cursor cursorId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),
                        new String[]{"_id"},null,null,null);
//默认联系人id就是1
                int contact_id = 1;
                if(cursorId.moveToLast()){
//拿到主键
                    int _id = cursorId.getInt(cursorId.getColumnIndex("_id")); 
//主键+1,就是要插入的联系人
                    contact_id = ++_id;
                }
//把 contact_id 添加到 raw_contacts 表中
                ContentValues values = new ContentValues();
                values.put("contact_id",contact_id);
                cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"),values);
//清空 ContentValues 插入姓名
                values.clear();
                values.put("data1", "盗跖");
                values.put("mimetype", "vnd.android.cursor.item/name");
                values.put("raw_contact_id", contact_id);
                cr.insert(Uri.parse("content://com.android.contacts/data"), values);
//清空 ContentValues 插入电话
                values.clear();
                values.put("data1", "888888888");
                values.put("mimetype", "vnd.android.cursor.item/phone_v2");
                values.put("raw_contact_id", contact_id); cr.insert(Uri.parse("content://com.android.contacts/data"), values);
                cursorId.close();
                Toast.makeText(MainActivity.this,"插入数据成功",Toast.LENGTH_SHORT).show();

            }
        });
运行测试结果

1

1

1

1



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值