Android开发之ContentProvider对联系人操作

来源:互联网 发布:淘宝开店店名 编辑:程序博客网 时间:2024/04/29 11:47

继续学习Android中,感觉好痛苦!!!有时候学习劲头很旺,有时候又想去他大爷的好烦呀,天天的看呀学呀的。搞技术都这么苦逼,不断去学习了解新的知识,恐怕自己的知识不够多,在这大城市被淘太了。不过再痛苦也要坚持,为了美好的明天,加油加油!

话不多说了进入今天的主题:使用contentprovider 对联系人进行操作

这里就只贴出一些主要的代码加上注解,就不做界面的展示了!

其实ContentProvider对联系人的操作无非就是,添加、删除、修改、查询,Android系统中的联系人信息不是全部存放在一张中的,而是分多张表存放的。

content://com.android.contacts/contacts 这个路径是对应的联系人的id表(raw_contacts

content://com.android.contacts/contacts/#/data 这个路径则是根椐联系人的id获取联系人具体信息的表(data)

两张表是一对多的关系

还有一张表是(mimetypes)表里边存放的是data表中每条记录内容对应的类型,比如手机号、或者是邮箱等。联系人操作最常用就是这三个不表

/**     * 根椐contentprovider 获取系统内部的联系人     */    public void getContants(View v) {        // 这个路径是获取所有联系人的id        Uri uri = Uri.parse("content://com.android.contacts/contacts");        ContentResolver resolver = this.getContentResolver();        //查询出这个raw_contacts中所有的联系人id        Cursor cursor = resolver.query(uri, new String[] { "_id" }, null, null,null);        //循环得到id        while (cursor.moveToNext()) {            int contacts_id = cursor.getInt(0);            StringBuffer buf = new StringBuffer("contactsid=");            buf.append(contacts_id);            //再根据联系人的id去查询具体的信息(如联系方式等)            uri = Uri.parse("content://com.android.contacts/contacts/"+ contacts_id + "/data");            //这里需要说明下data1字段存放的就是电话号、或者邮箱等信息            Cursor datacursor = resolver.query(uri, new String[] { "mimetype","data1", "data2" }, null, null, null);            while (datacursor.moveToNext()) {                String type = datacursor.getString(datacursor.getColumnIndex("mimetype"));                String data = datacursor.getString(datacursor.getColumnIndex("data1"));                //如果记录的类型是姓名和手机号打印出来                if ("vnd.android.cursor.item/name".equals(type)) {                    Log.i("xinzhifu", data);                } else if ("vnd.android.cursor.item/phone_v2".equals(type)) {                    Log.i("xinzhifu", data);                }            }        }    }//其实想想和web开发是对数据操作一样的简单//接下来我们根据手机号查询某个指定的联系人/**     * 这里我们根椐手机号码去查询出联系人信息     */    public void getInfoByPhoneNum(){        String numner = "15981480726";        //这个是路径根椐手机号码去查询出联系人信息        Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+numner);        ContentResolver resolver = this.getContentResolver();        //这里只是获取了联系人姓名        Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null, null, null);        if(cursor.moveToFirst()){            String name = cursor.getString(0);            Log.i("xinzhifu", name);        }        cursor.close();    }

接下来是插入联系人信息(这是个需要特别注意的下个操作)
插入联系人的操作流程是:
1.在raw_contacts表中插入一条记录获取返回的一个主键id,然后在在data表中插入相关的基础信息把id作为data表中的一个外键。但是值得注意的是每次insert都是单独的一次操作,如果后边的插入操作出错而前边的操作成功那么那就导致出错,所以要保证所有操作同时成功或者同时失败,这就需要用到了ContentProvider的事务管理。

    /* 根椐contentprovider 添加联系人     * 这种是逐一执行插入操作     */    public void insetContact() {        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");        ContentResolver resolver = this.getContentResolver();        ContentValues values = new ContentValues();        long contactsid =ContentUris.parseId(resolver.insert(uri, values)) ;        Log.i("xinzhifu", "contactsid"+contactsid);        uri = Uri.parse("content://com.android.contacts/data");        values.put("raw_contacts_id", contactsid);        values.put("mimetype", "vnd.android.cursor.item/name");        values.put("data2", "测试君");        resolver.insert(uri, values);        values.clear();             values.put("raw_contacts_id", contactsid);        values.put("mimetype", "vnd.android.cursor.item/phone_v2");        values.put("data2", "2");        values.put("data1", "123456789");        resolver.insert(uri, values);    }但是这种方式不好控制,所以我们要用事务的方式。代码如下:/***这种方法将所有的操作放入一个list中进行逐一操作,实现事务**/public void insetContact() throws RemoteException, OperationApplicationException {        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");        ContentResolver resolver = this.getContentResolver();        //定义存放数据操作的list        ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();        //创建一个操作        ContentProviderOperation operation1 = ContentProviderOperation.newInsert(uri)                .withValue("account_name", null)                .build();        operations.add(operation1);        uri = Uri.parse("content://com.android.contacts/data");        /**         值得说明一下的是 withValueBackReference("字段名",0)这个方法的意思是:这个插入操作的  raw_contacts_id 字段的值为ArrayList<ContentProviderOperation> 中游标为 “0”的插入操作执行后的返回值,也就是返回的主键id*/        ContentProviderOperation operation2 = ContentProviderOperation.newInsert(uri)                .withValueBackReference("raw_contacts_id", 0)                .withValue("mimetype", "vnd.android.cursor.item/name")                .withValue("data2", "测试君")                .build();        operations.add(operation2);        ContentProviderOperation operation3 = ContentProviderOperation.newInsert(uri)                .withValueBackReference("raw_contacts_id", 0)                .withValue("mimetype", "vnd.android.cursor.item/phone_v2")                .withValue("data2", "2")                .withValue("data1", "123456789")                .build();        operations.add(operation3);        /**最后提交插入操作        大致事务操作:            begin()               dosomething()            end()        */        resolver.applyBatch("com.android.contacts", operations);    }
0 0