您的位置:首页 > 移动开发 > Android开发

android-ContentProvider获取联系人信息

2016-05-19 20:20 369 查看
其实Google提供了许多常用Intent,可以方便的与系统应用交互,这里讲的是原始的方法

联系人数据库表较多,重要的是3个:

1、raw_contacts表,contact_id列存放联系人id

2、data表,data1列存放姓名或数据或email,mimetype_id存放数据类型的字符串说明(可确定是到底存放的是name,number还是email),raw_contact_id存放联系人id

3、mimetypes表:根据字符串数据类别,对应的id含义:1-email,5-phone,7-name

注意需要读写联系人的权限

一、查询:

步骤:1.遍历raw_contact表,取出id

      2.根据id在data表中取数据,相同id可取出姓名,电话,email

      3.可根据mimetype_id在mimetypes表中查询是姓名,电话,还是email

★联系人被删除时,数据仍在数据库中,只是id被至为null

    ContentResolver cr = getContentResolver();
//低版本路径不同,不适用,会出错

    Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");//raw_contacts表的uri

    Uri dataUri = Uri.parse("content://com.android.contacts/data");//data表的uri

    Cursor cursor = cr.query(uri, null, null, null, null);

    while(cursor.moveToNext()){

    //根据id取出数据

    String id = cursor.getString(cursor.getColumnIndex("contact_id"));

    if( id != null){//有的联系人被删除,id被至为null,会导致id值为null
    Cursor datacursor = cr.query(dataUri, null, "raw_contact_id=?", new String[]{id}, null);
    while(datacursor.moveToNext()){
    String data1 = datacursor.getString(datacursor.getColumnIndex("data1"));//取得姓名,电话或email
    String mime = datacursor.getString(datacursor.getColumnIndex("mimetype"));//取得数据类型的说明字符串
//这里并不是mimetype_id,其实查询的是一个视图,列名叫mimetype
    System.out.println(data1);
    System.out.println(mime);
    }
    datacursor.close();
    System.out.println("-----------------------------------------");

    }

    }

    cursor.close();

★可在查询字符串中加入and mimetype=?,将需要查询的类型字符串写入参数字符串数组,如:vnd.android.cursor.item/name
就可以只取得data1列数据为姓名的行,只取得联系人姓名

二、新增通讯录联系人

步骤:1.在raw_contacts表中增加id

      2.使用此id在data表中插入数据

ContentResolver cr = getContentResolver();

    Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");

    Uri dataUri = Uri.parse("content://com.android.contacts/data");

    //更新raw_contact表

    ContentValues cv = new ContentValues();

    Cursor cursor = cr.query(uri, new String[]{"_id"}, null, null, null);

    cursor.moveToLast();
//移至最后一行,取得id,加1得到应插入行的id

    int lastId = cursor.getInt(0);

    int newId = lastId+1;

    cv.put("contact_id", newId);
//插入id

    cr.insert(uri, cv);

//更新data表
电话    

    ContentValues num = new ContentValues();

    num.put("data1", "81881");

    num.put("mimetype", "vnd.android.cursor.item/phone_v2");

    num.put("raw_contact_id", newId);

    cr.insert(dataUri, num);

    //邮箱

    ContentValues email = new ContentValues();

    email.put("data1", "123@qq.com");

    email.put("mimetype", "vnd.android.cursor.item/email_v2");

    email.put("raw_contact_id", newId);

    cr.insert(dataUri, email);

    //姓名

    ContentValues name = new ContentValues();

    name.put("data1", "Koma");

    name.put("mimetype", "vnd.android.cursor.item/name");

    name.put("raw_contact_id", newId);

    cr.insert(dataUri, name);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: