Contacts Provider基础

article/2025/10/20 13:00:36

      作为四大组件之一的ContentProvider工作中我们很少会用到自己自定义的ContentProvider,用到的最多的就是系统提供的。官方文档提供了两种系统ContentProvider,一种是CalendarProvider,一种是Contacts Provider。今天我们的主角就是Contact Provider。

     The Contacts Provider is an Android content provider component. It maintains three types of data about a person

    这句话源于官网,大概意思就是Contacts Provider是安卓内容提供者组件,它维护着关于用户的三种数据类型。

   这三种数据类型指向三种表:ContactsContract.Contacts、ContactsContract.RawContacts、ContactsContract.Data

  

  下面我们就分别看一下三个表的表结构:

   Contacts:由下面的表结构我们可以发现,该表主要维护着_id和raw_contact_id这两个字段。

    RawContacts: containing a summary of a person's data, specific to a user account and type.(包含着用户信息的摘要以及一个用户的账户和类型的详情)

   

  Data:containing the details for raw contact(包含raw contact表的详情)



  通过上面的图文并茂,我们已经初略的了解了三个表的结构以及作用,下面我们就来分别了解一下三个表的应用:

  仔细观察我截取的图片,不难发现一个数字在三个表都有出现,那就是“25”;在Contacts表中,我们可以发现_id和raw_contact_id是一样的,没错,这不是偶然的,如果你多添加几条联系人就会相信这个结果的。那么这个id又有什么用呢?又是如何产生的呢?

  首先我们来看它是如何产生的:

     当我们想增加一条新的联系人的时候,首先我们必须先在RawContacts这个表中插入一条数据,然后系统就会给我们返回一个URi,此Uri里面就包含该ID。代码如下:     

 ContentValues values = new ContentValues();Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);long rawContactId = ContentUris.parseId(rawContactUri);

    有了这个ID,我们就可以尽情的插入我们的数据啦:

                                                                             增加联系人

    第一步:插入联系人名称:

      

     contentValues.clear();contentValues.put(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, rawContactId);contentValues.put(ContactsContract.CommonDataKinds.StructuredName.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "王五");contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    第二步:插入手机号:ContactsContract.CommonDataKinds.Phone

       

  contentValues.clear();contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "13688888888");contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
      第三步:插入邮箱地址:( ContactsContract.CommonDataKinds.Email)

    

  contentValues.clear();contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.Email.ADDRESS, "********@hotmail.com");contentValues.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_HOME);contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    第四步:插入网址: (ContactsContract.CommonDataKinds.Website)

     

  contentValues.clear();contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.Website.URL, "www.taolv365.com");contentValues.put(ContactsContract.CommonDataKinds.Website.TYPE, ContactsContract.CommonDataKinds.Website.TYPE_WORK);contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    第五步:插入地址 (ContactsContract.CommonDataKinds.StructuredPostal)
   contentValues.clear();contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, "上步路");contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, "008512");contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK);contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
   第六步:插入昵称 (ContactsContract.CommonDataKinds.Nickname)

     

   contentValues.clear();contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.Nickname.NAME, "娃哈哈");contentValues.put(ContactsContract.CommonDataKinds.Nickname.TYPE, ContactsContract.CommonDataKinds.Nickname.TYPE_SHORT_NAME);contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
      第七步:插入备注 (ContactsContract.CommonDataKinds.Note)

      

   contentValues.clear();contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.Note.NOTE, "备注成功");contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    第八步:插入即时消息 (ContactsContract.CommonDataKinds.Im)

     

   contentValues.clear();contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.Im.DATA, "即时消息");contentValues.put(ContactsContract.CommonDataKinds.Im.TYPE, ContactsContract.CommonDataKinds.Im.TYPE_HOME);contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
     插入的数据都是保存在Data表里面的,所以 URI为:ContactsContract.Data.CONTENT_URI

   

                                                                                         删除联系人

  

   contentResolver.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts.CONTACT_ID+"=?",new String[]{"26"});contentResolver.delete(ContactsContract.Data.CONTENT_URI, ContactsContract.Data.CONTACT_ID+"=?",new String[]{"26"});Toast.makeText(MainActivity.this,"删除成功",Toast.LENGTH_LONG).show();
      注意:删除数据的时候要同时删除RawContacts和Data表里面的数据


                                                                                      修改联系人信息

    

    contentValues=new ContentValues();contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, 27);contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "13699999999");contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);contentResolver.update(ContactsContract.Data.CONTENT_URI, contentValues, ContactsContract.Data.CONTACT_ID + "=?", new String[]{"27"});Toast.makeText(MainActivity.this,"修改成功",Toast.LENGTH_LONG).show();
                                                     

                                                                                      查询联系人信息

       

<span style="color:#333333;">     cursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME},null,null,null);while (cursor.moveToNext()){String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Data._ID));Cursor cursor_phone=contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}, ContactsContract.Data.RAW_CONTACT_ID+"=?",new String[]{id},null);if (cursor_phone !=null){while (cursor_phone.moveToNext()){String name=cursor_phone.getString(cursor_phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));String number=cursor_phone.getString(cursor_phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));textView_show.append("_Name:"+name+"Number:"+number+"\n");}}}</span>

             另外,所有表的列名都可以在ContactsContract.DataColumns这个接口的实现类里面找到。


http://chatgpt.dhexx.cn/article/dBg1Wng1.shtml

相关文章

Error: invalid code, hints: [ req_id: * ]

1、问题描述&#xff1a;这个问题是在处理订单支付时需要用户登录遇到的&#xff0c;具体报错信息如下&#xff1a; 2、报错原因&#xff1a; 当前开发者的appid没有支付权限导致 3、解决方案&#xff1a; 需要负责人给分配对应的权限

This application’s bundle identifier does not match its code signing identifier.

今天使用carthage更新第三方后莫名出现真机云心失败,提示 This application’s bundle identifier does not match its code signing identifier. 解决方法: /usr/local/bin/carthage copy-frameworks 进入Building Phases 单击并在New Run Script Phase中添加脚本 将/usr/lo…

Code Sign error: a valid provisioning profile matching the application's Identifier 'com.yourcompany

出现这个错误的原因是因为&#xff1a;appid和provisioning profile不匹配 &#xff01;有两种解决的办法&#xff1a;重新下载provisioning profile&#xff0c;或者可能因为&#xff1a;生成证书和appid 所用的根证书不同&#xff0c;最好重新都生成然后下载。&#xff08;这…

ANTD react 手机号(验证码)登陆 + 账号登陆(图形验证码)

这种页面可能是大家常用的,但重写比较费时间,之前没有搜到完整的,在这里自己总结一下,方面复用 代码: <LoginFormformRef{formRef}initialValues{{autoLogin: false}}onFinish{async values > {await handleSubmit(values as LoginParams)}}><Tabs activeKey{type…

Springboot+axios+vue使用VerifyCodeUtils工具类实现验证码图片功能

一、环境准备 ideajava 1.8maven 3.6.3操作系统&#xff1a;window10vue.min.jsaxios.min.js 二、VerifyCodeUtils工具类 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import ja…

Identity and Authentication - Common Authentication Methods

Username and Passwords This is the most common method of identifying users in the age of Software as a Service (SaaS) 解释上面的图中的步骤&#xff1a; Login Request: POST /login postuser {username: users,password: pws }Find users: SELECT * FROM databa…

iOS code signing identity 配置

PROJECT 和 TARGET 中都要选:code signing identity: 调试统一都选 developer, 发布统一都选 distribution provisioning Profile 也要选. 过期和无效的证书及时删除, 避免 ambiguous 警告. 选择正确的证书配置后仍然报错, clean 一下重启 xcode 还不行~~~重启电脑

Invalid CAPTCHA response. Please try again. (Code: 1201)

项目场景&#xff1a; Invalid CAPTCHA response. Please try again. (Code: 1201) 解决方案&#xff1a; 直接使用隐私浏览器打开即可。

经典的Embedding方法Word2vec

提起Embedding,就不得不提Word2vec,它不仅让词向量在自然语言处理领域再度流行&#xff0c;更为关键的是&#xff0c;自2013年谷歌提出Word2vec以来&#xff0c;Embedding 技术从自然语言处理领域推广到广告、搜索、图像、推荐等深度学习应用领域&#xff0c; 成了深度学习知识…

embedding表示方法及原理

目录 1.前言2.embedding表示方法2.1 word2vec embedding2.2 neural network embedding2.3 graph embedding 3.参考文献 1.前言 近几年embedding的使用及优化在各种比赛、论文中都有很多的应用&#xff0c;使用embedding表示特征的空间表示也在各种应用中确定是一种很有效的特征…

深度学习:词嵌入Embedding

http://blog.csdn.net/pipisorry/article/details/76095118 词嵌入 词嵌入其实就是将数据的原始表示表示成模型可处理的或者是更dense的低维表示&#xff08;lz&#xff09;。 One-hot Embedding 假设一共有个物体&#xff0c;每个物体有自己唯一的id&#xff0c;那么从物体…

什么是embedding(把物体编码为一个低维稠密向量),pytorch中nn.Embedding原理及使用

文章目录 使embedding空前流行的word2vec句子的表达训练样本损失函数输入向量表达和输出向量表达 v w v_{w} vw​ 从word2vec到item2vec讨论环节pytorch中nn.Embedding原理及使用pytorch中nn.Embedding原理及使用一些注意的点 参考 简单来说&#xff0c;embedding就是用一个低维…

讲清楚embedding到底在干什么

要搞清楚embeding先要弄明白他和one hot encoding的区别&#xff0c;以及他解决了什么one hot encoding不能解决的问题&#xff0c;带着这两个问题去思考&#xff0c;在看一个简单的计算例子 以下引用 YJango的Word Embedding–介绍 https://zhuanlan.zhihu.com/p/27830489 On…

一文读懂Embedding

文章目录 一、**什么是Embedding&#xff1f;**二、One-Hot编码三、**怎么理解Embedding****四、Word Embedding** 一、什么是Embedding&#xff1f; “Embedding”直译是嵌入式、嵌入层。 简单来说&#xff0c;我们常见的地图就是对于现实地理的Embedding&#xff0c;现实的…

Embedding的理解

Embedding 嵌入&#xff0c;我们可以将其理解为一种降维行为。可以将高维数据映射到低维空间来解决稀疏输入数据的问题。 它主要有以下三个目的&#xff1a; 在 embedding 空间中查找最近邻&#xff0c;这可以很好的用于根据用户的兴趣来进行推荐。作为监督性学习任务的输…

BERT的三个Embedding详解

BERT将输入文本中的每一个词&#xff08;token)送入token embedding层从而将每一个词转换成向量形式 两个嵌入层&#xff0c;segment embeddings和 position embeddings token embedding token embedding 层是要将各个词转换成固定维度的向量。在BERT中&#xff0c;每个词会被…

Embedding层的理解

Embedding层的理解 转载自&#xff1a;原文&#xff1a;深入理解 Embedding层的本质_罗小丰同学的博客-CSDN博客_embedding层 首先&#xff0c;我们有一个one-hot编码的概念。 假设&#xff0c;我们中文&#xff0c;一共只有10个字。。。只是假设啊&#xff0c;那么我们用0-…

Embedding理解与代码实现

Embedding 字面理解是 “嵌入”&#xff0c;实质是一种映射&#xff0c;从语义空间到向量空间的映射&#xff0c;同时尽可能在向量空间保持原样本在语义空间的关系&#xff0c;如语义接近的两个词汇在向量空间中的位置也比较接近。 下面以一个基于Keras的简单的文本情感分类问…

深度学习中Embedding层有什么用?

2019年03月24日15:23:32更新&#xff1a; 由于CSDN图片经常显示不出来&#xff0c;本文最新链接请点击&#xff1a;https://fuhailin.github.io/Embedding/ 博主所有博客写作平台已迁移至&#xff1a;https://fuhailin.github.io/ &#xff0c;欢迎收藏关注。 这篇博客翻译自国…

pytorch nn.Embedding的用法和理解

&#xff08;2021.05.26补充&#xff09;nn.Embedding.from_pretrained()的使用&#xff1a; >>> # FloatTensor containing pretrained weights >>> weight torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]]) >>> embedding nn.Embedding.from…