关于Content Provider中Contacts的一些知识

Android语言基础教程(204)Android预定义Content Provider范例之系统内置联系人的使用:潜入Android系统联系人数据库:Content Provider实战全揭秘 还记得第一次开发需要读取手机联系人的功能吗?小心翼翼的申请了READ_CONTACTS权限,然后呢?面对一堆晦涩的API接口和复杂的表结构,是否曾感到无从下手?作为Android四大组件之一,Content Provider的“知名度”似乎不如Activity和Service,但它却是应用间数据共享的桥梁。今天,就让我们一起潜入Android系统联系人数据库的内部,揭开Content Provider的神秘面纱。 阅读详情

         ContactsContract  类中有很多内嵌的类帮助操作Contect Provider中的Contracts,其中用的比较多的有Data类对应数据库的Data表(比较重要)、RawContrats类对应的raw_contacts表、Groups类对应的groups表。Data表非常重要,用于存储各种类型的数据,用MIMEType类进行区分,数据存储在Data1~Data15中,各种类型不一样,需要查看相应的MIMEType,例如有如下一些类型(来源于http://developer.android.com/reference/android/provider/ContactsContract.Data.html):

The MIME type of the item represented by this row. Examples of common MIME types are:

下表是利用sqlite Manager查看虚拟机中导出的Provider.Contacts中的Data表中的键的情况,与Android Developer的开发文档对应的描述对应。

                                                         Data表

同理:rawContacts、Groups表也有相应的对应情况,值得注意的是这几个表相互联系,例如Data表中的通过raw_contact_id与raw_contacts表中的_id相联系,构成多对一关系,group表中的 _id与Data表中的Data1对应(前提是MIMETYPE= ContactsContract.CommonDataKinds.GroupMemeberShip),因此推理,Data表可以与其他的表进一步向关联,所以Data表应该是所有表的中介。当然这些表之间也有冗余,猜测其目的是为了方便于查找的,因此如果要对表进行更改,需要注意有没有相联系的表需要进行相应的更改操作(好像这里有隐含同步的操作方式,只要操作一个表,同步机制会相应的更改联系的表,待以后研究)


参考文档中还推荐了几种操作的代码,可供参考:

Insert

An individual data row can be inserted using the traditional insert(Uri, ContentValues) method. Multiple rows should always be inserted as a batch.

An example of a traditional insert:

 ContentValues values = new ContentValues();
 values.put(Data.RAW_CONTACT_ID, rawContactId);
 values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
 values.put(Phone.NUMBER, "1-800-GOOG-411");
 values.put(Phone.TYPE, Phone.TYPE_CUSTOM);
 values.put(Phone.LABEL, "free directory assistance");
 Uri dataUri = getContentResolver().insert(Data.CONTENT_URI, values);
 

The same done using ContentProviderOperations:

 ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();

 ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
          .withValue(Data.RAW_CONTACT_ID, rawContactId)
          .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
          .withValue(Phone.NUMBER, "1-800-GOOG-411")
          .withValue(Phone.TYPE, Phone.TYPE_CUSTOM)
          .withValue(Phone.LABEL, "free directory assistance")
          .build());
 getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
 
Update

Just as with insert, update can be done incrementally or as a batch, the batch mode being the preferred method:

 ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();

 ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
          .withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
          .withValue(Email.DATA, "somebody@android.com")
          .build());
 getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
 
Delete

Just as with insert and update, deletion can be done either using the delete(Uri, String, String[]) method or using a ContentProviderOperation:

 ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();

 ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
          .withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
          .build());
 getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
 
Query

Finding all Data of a given type for a given contact
 Cursor c = getContentResolver().query(Data.CONTENT_URI,
          new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
          Data.CONTACT_ID + "=?" + " AND "
                  + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
          new String[] {String.valueOf(contactId)}, null);
 

Finding all Data of a given type for a given raw contact
 Cursor c = getContentResolver().query(Data.CONTENT_URI,
          new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
          Data.RAW_CONTACT_ID + "=?" + " AND "
                  + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
          new String[] {String.valueOf(rawContactId)}, null);



Android语言基础教程(199)Android预定义Content Provider之查询数据:别再说Content Provider是玄学!这次用“查水表”的姿势让你秒懂数据查询 还在为Android数据查询头秃?这篇256字极速上车指南,用“查水表”的比喻拆解Content Provider核心玩法。从权限骚操作到URI暗号对接,从查询参数黑话到线程避坑指南,附赠完整通讯录查询Demo。让你用最野的路子搞定Android系统数据查询,从此告别“从入门到放弃”! 阅读详情

相关推荐

Android Content Provider实战:访问联系人和图片

在Android开发中,权限系统是为了确保应用在访问系统资源或执行敏感操作时,用户的隐私和数据安全得到保护。Android权限分为两类:普通权限和危险权限。普通权限涉及的是一些基本的操作,通常不会对用户的安全和隐私构成威胁,例如设置闹钟、访问网络等。普通权限不需要用户显式授权,当应用声明了这些权限后,系统默认授权。危险权限是指可能会触及用户的隐私信息或对设备的安全造成威胁的权限,例如读取联系人、发送短信、访问位置等。这类权限需要用户在应用首次尝试使用时进行授权。在Android开发中,

weixin_29155599的博客 1101

ContentProviderOperation

contentProviderOperation 批量处理方式newInsert 插入newUpdate 更新newDelete 删除 withSelection (String selection, String[] selectionArgs) 指定需要操作的数据条件。只有在更新、删除操作中有用。 withValue (String key, Object value)

2232

紫光同创FPGA中ADF网表文件的黑匣子封装与PDS环境实战指南

本文详细介绍了在紫光同创FPGA开发环境中使用ADF网表文件进行黑匣子封装的实战指南。通过PDS环境配置、加密ADF生成、黑匣子集成及验证调试等步骤,帮助开发者实现核心IP保护,同时保持设计性能。特别适用于需要模块级代码保护的企业级FPGA开发场景。

weixin_33725239的博客 343

使用 ContentProviderOperation 来提升性能

使用 ContentProviderOperation 来提升性能 ContentProviders  是android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端。 有时候你需要更新多行数据,可以选择调用多次ContentResolver的对应函数,或者 使用批量操作。当然 后者性能会比较好些。 为了使批量更新、

goutiantian的博客 570

VCSA 6.7证书过期别慌!手把手教你通过SSH修改系统时间恢复登录(附STS证书修复脚本)

本文详细介绍了VCSA 6.7证书过期的应急处理方案,包括通过SSH修改系统时间临时恢复登录、全面更新证书体系以及专项修复STS证书的实战步骤。文章还提供了后期验证和系统加固的建议,帮助运维人员有效应对证书过期问题,确保虚拟化平台的稳定运行。

weixin_31292729的博客 418

【AirSim+PX4】WSL2上运行PX4连接Airsim步骤

在 Linux 命令行中输入以下命令以添加(或改变)环境变量。注意,此处的 IP 地址应为。4.启动 sln 文件的调试以进入 UE4 编辑器,并在 Linux 中启动 PX4。

m0_53538421的博客 1505

基础总结篇之六:ContentProvider之读写联系人

靡不有初,鮮克有終。《詩經》 很多事情,绝大多数人都会在开始的时候满怀热情,而能坚持到底的却是寥寥无几。对待自己的目标,虎头蛇尾绝不可取,半途而废只会一无所成,我们必须持之以恒的做下去,坚持到底才能摘取胜利的果实。最近也忙了起来,忙着给自己充电,深知这项任务的艰巨,不是一天两天的事,所以也借用这句警言来告诫自己,坚持不懈的走下去。 今天我们来讲解一下如何利用ContentProvider机制读...

t225com 417

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 414

ContentProviderOperation批量操作提升性能

ContentProviders 是Android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端。有时候你需要更新多行数据,可以选择调用多次ContentResolver的对应函数,或者 使用批量操作

JackChan 6778

ubuntu安装glibc

VSCode 在ubuntu下调试无法打开libc-start.c raise.c等1. 安装glibc2. launch.json中添加路径映射3. 调试 1. 安装glibc apt install glibc-source cd /usr/src/glibc/ sudo tar -xvf glibc-[VERSION].tar.xz 2. launch.json中添加路径映射 "sourceFileMap": { "/build/glibc-S7xCS9": "/usr/src/glib

wq_0708的博客 3万+

老N卡福音:GT1030/GTX1050在MacOS Ventura 13.2上的完整驱动指南(附实测截图)

本文详细介绍了如何在MacOS Ventura 13.2上通过OCLP工具链驱动GT1030和GTX1050等老款NVIDIA显卡,涵盖硬件兼容性验证、BIOS设置、OpenCore配置、驱动安装及性能测试全流程。实测数据显示,这些基于Pascal和Maxwell架构的显卡在当代MacOS系统中仍能发挥实用价值,为老N卡用户提供完整解决方案。

weixin_30832143的博客 634

联系人的获取--ContentProvider

ContentProvider: 1、ContentProvider为存储和读取数据提供统一的接口; 2、使用ContentProvider,应用程序可以实现数据共享; 3、android内置的许多数据都是使用ContentProvider形式,供开发者调用(如视频、音频、图片、通讯录等);  URI:Universal Resource Ident

Sunrise的专栏 1204

行人检测模型在海思平台上的部署:从 PyTorch 到 NNIE 深度优化与实践

摘要 本文详细介绍行人检测模型从PyTorch到海思NNIE平台的部署流程。首先分析了行人检测面临的挑战(尺度变化、遮挡、姿态多样性等)及边缘部署的优势(实时性、隐私保护等)。重点阐述了模型转换过程:PyTorch→ONNX→Caffe→NNIE-WK,其中PyTorch转ONNX需注意评估模式设置、虚拟输入匹配、操作集版本选择等关键点。文章旨在帮助开发者在海思3516D芯片上实现高效的行人检测,克服部署过程中的常见问题,最终实现边缘设备的实时目标检测能力。

FJN110的博客 218

Content Provider与SQLite结合使用

虽然推荐使用数据库保存结构化的复杂数据,但是数据共享是一个挑战,因为数据库只允许创建它的应用访问。在Android中,推荐使用content provider方法在不同包之间共享数据。content provider可以被视为一个数据仓库。它如何存储数据与应用如何使用它无关。本例将讲解Content Provider与SQLite结合使用。

Notzuonotdied的博客 2490

华为OD新系统真题-最小极差分组(C/C++/Py/Java/Js/Go)

华为OD机试 新系统真题【最小极差分组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【最小极差分组】多语言题解。

qq_45776114的博客 595

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android contacts content provider学习小结

最近想做一个功能,能够获取android最近修改的联系人,包括added/updated/deleted。虽然最后还是没有找到很好的办法,但顺便学习了下Android contacts content provider机制。 Android contacts content provider是一个系统级别的content provider。content provider提供了一种机制,使得

lyglostangel的专栏 1589

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android Content Providers(二)——Contacts Provider

接上篇Android内容提供者——Content Providers(一) Contacts Provider是Android中一个强大并且灵活的组件,负责管理系统通讯录的数据,对外提供访问接口来对系统通讯录进行访问和操作。 以下是Contacts Provider的组织结构图: 可以看出Android的系统通讯录是三层架构,通过URI进行访问。下面看一下每一层的类结构和官方解释:

Ryan's zone 6501

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

3-6安卓中的Content Provider组件

​继承与重写方法​需继承ContentProvider类并实现以下核心方法:java@Overridepublic boolean onCreate() { /* 初始化数据库等操作/ }@Override查询逻辑 */ }// 重写insert、update、delete、getType方法getType():返回MIME类型(如vnd.android.cursor.dir/user表示多行数据)。​注册Provider​。

weixin_45530192的博客 1439

Android API Guides 之 App Components(14) - Content Providers - Contacts Provider

Contacts Provider QUICKVIEW Android's repository of information about people.Syncs with the web.Integrates social stream data. IN THIS DOCUMENT Contacts Provider OrganizationRaw

追寻梦想 4650

Android联系人数据操作完全指南 - 基于Contacts Provider的实战教程

Android联系人数据操作完全指南 - 基于Contacts Provider的实战教程 前言 在Android应用开发中,处理联系人数据是一个常见需求。无论是社交类应用、通讯工具还是企业级软件,都可能需要访问或修改用户的联系人信息。本文将深入讲解如何使用Android平台提供的Contacts Provider来高效、安全地管理联系人数据。 Contacts Provider架构解析 Cont...

gitblog_00906的博客 531

玩转android本地Content Provider【Android】

---------------------- android培训、java培训、期待与您交流! ------------------------- 银行业务调度系统 ---------------------- android培训、java培训、期待与您交流! -------------------------

succ 1018

Content Provider使用方法以及Android运行时权限申请

本文通过一个获取所有联系人实例来展示如何获取其他应用数据以及运行时权限申请过程。 AndroidManifest.xml加入如下权限 <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> 声明一个listView存放取到的联系人信息;检测是否有对应权限,...

Zhu的博客 1934

Android本地的Content Provider

Android暴露了许多Content Provider来访问本地的数据库。 你可以使用之前描述的技巧来使用本地的Content Provider。可变通的地方,android.provider类包含了一些便利的类来简化这些有用的Provider,包括: ❑ Browser 使用Browser Content Provider可以用来读取或修改标签、浏览历史或...

de14141983的专栏 297

Android联系人数据修改终极指南:使用Intent高效操作Contacts Provider

想要在Android应用中轻松管理联系人数据?通过Intent操作Contacts Provider是最高效的方法!📱 这篇完整教程将教你如何通过系统原生功能实现联系人数据的插入、编辑和更新,无需复杂的权限申请和UI开发。 Android联系人数据修改是每个开发者都需要掌握的核心技能。使用Intent而不是直接访问Contacts Provider,可以节省开发时间、避免错误,并减少应用权限需

gitblog_00147的博客 774

Android Contacts (android通讯录读取)-content provider

Content Provider 在数据处理中,Android通常使用Content Provider的方式。Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增、删、改、查的操作。Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问。简单地说,And...

2264

Content Provider

  package wyf.wpf; //声明包语句 import android.app.Activity; //引入相关类 import android.content.ContentResolver; //引入相关类 import android.database.Cursor; //引入相关类 import android.net.Uri; /...

每天用两个小时来学习新的知识 180
上一篇: Android之使用ContentResolver对通信录中的数据进行简单操作
下一篇: 访问android平台的通话记录CallLog
shareCode
博客等级 码龄15年 125粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值