码迷,mamicode.com
首页 > 其他好文 > 详细

以获取和添加联系人为例学习调用系统ContentPrivider

时间:2016-07-13 17:44:27      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

以获取和添加联系人为例,学习调用系统提供的ContentProvider

安卓系统在做联系人这个APP的时候,就已经提供好了一个联系人的ContentProvider。
包括3个表
1.raw_contacts表
Contact_id存放联系人的id
该表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。
2.data表
这个表用来储存所有的联系人的详细信息的
一个联系人的信息可能存在多条数据,其中比较重要的字段是数据类型,联系人id,还有数据内容,
其中有一个字段mime_type是数据类型(电话,邮箱,名字)
技术分享
3.mimeType表
就是联系人所有的数据库类型选项
技术分享

技术分享

代码部分,布局未列出。

package com.user.android2_lesson_06_systemcontentprivider;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/**
 * 调用系统提供的ContentPrivider
 * 今天以获取联系人为例
 * 系统在写联系人这个app的时候,就已经提供好了一个联系人的ContentPrivider
 * 看一下系统提供的联系人数据库
 * 源码里面都有。我们看一下截图
 * raw_contacts表
 * contact_id存放联系人的id
 *
 * data表这个表示用来存储所有联系人的详细信息。
 * 一个联系人的信息可能分为多条数据,
 * 其中比较重要的字段是数据类型,联系人id,还有数据内容
 * 其中有一个字段mime_type是数据的类型(电话、邮箱、名字等)
 * mime_type表
 * 联系人所有的数据类型选项
 *
 * 看源码可以看出contentPrivider有两个Uri,两个都是可以用的
 * 但是在4.0之后只能使用分号后面的Uri,该路径是向低版本兼容的
 *
 * 如果要获取联系人的数据,该怎么做?
 * 1.获取所有的联系人的id
 * 2.根据id查询到这个联系人的所有的数据消息
 *
 */
public class MainActivity extends AppCompatActivity {

    private Button mGetContacts;
    private Button mUpdataContacts;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mGetContacts = (Button) findViewById(R.id.getContacts);
        mUpdataContacts = (Button) findViewById(R.id.updataContacts);
        mGetContacts.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;
                }
//                2.根据id,获取到每一个联系人的所有信息
                while(cursorID.moveToNext()){
//                    拿到id的字符串
                    String contactid = cursorID.getString(cursorID.getColumnIndex("contact_id"));
//                    根据id去data数据库里查询联系人的所有信息
                    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".equals(mimeType)){
                            Log.i("名字",data1);
                        }
                    }
//                            关闭游标对象释放内存
                    contactData.close();
                }
//                关闭游标对象释放内存
                cursorID.close();
//                3.添加权限,允许读取ContentPrivider
            }
        });

//        通过上面分析,我们想要插入联系人,就需要如下的操作:
//        1、先去 raw_contacts 表中添加 id;
//        2、然后借助 id 去 data 表中添加各种信息。
        mUpdataContacts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ContentResolver cr2 = getContentResolver();
//先查询 raw_contacts 表,获取最新联系人的主键,然后主键+1,就是要插入的联系人的 id
                Cursor cursorId = cr2.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);
                cr2.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);
                cr2.insert(Uri.parse("content://com.android.contacts/data"), values);
//清空 ContentValues 插入电话
                values.clear();
                values.put("data1", "110119120");
                values.put("mimetype", "vnd.android.cursor.item/phone_v2");
                values.put("raw_contact_id", contact_id); cr2.insert(Uri.parse("content://com.android.contacts/data"), values);
                cursorId.close();
                Toast.makeText(getApplicationContext(),"插入数据成功",Toast.LENGTH_SHORT).show();
            }
        });

    }
}
这里注意需要添加读写权限
  <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

以获取和添加联系人为例学习调用系统ContentPrivider

标签:

原文地址:http://blog.csdn.net/linyj199102/article/details/51884136

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!