android-ContentProvider获取联系人信息

其实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);



























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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值