Android ContentProvider之联系人数据库及操作

2024-06-02 08:08

本文主要是介绍Android ContentProvider之联系人数据库及操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



通讯录数据库的主要表之间架构关系:


第一层:Data层,每种独立的数据类型占一行。具体哪些独立的数据可以占一行,可以在mimetypes这张表中找到, 原生Android的系统 一共12种,例如name,phone,email ect..


第二层:RawContracts层,由Data层的多条数据组合成一个完整的联系人信息。


第 三层:Contracts层,这一层主要注意与第二层的区别。大部分情况下这两层的数据时指同一个联系人的信息,即他们俩是一一对应的关系,但是有些特殊 情况,这个我是查了一些老外的论坛加上自己的理解,例如 我做一个本地通信录和网络上的通信录同步的时候,可能有一个人他在本地存在,他在网络上也存在,这个时候Android就可以识别他们,认为他们两个其实 是指同一个人。 (这种情况我没有试出来,我感觉这个其实是Android创造了这个概念之后,留给我们开发自己去实现的。)


开发主要用到前两层


contacts.db中三个比较重要的表:

1.

“mimetype”是电话 或者 姓名 的标示符编码:

例如:电话 对应“vnd.android.cursor.item/phone_v2

姓名 对应“vnd.android.cursor.item/name

邮件 对应“vnd.android.cursor.item/email_v2


根据mimetype确定data的类型




2.

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

raw_contacts表

该表保存了所有创建过的手机测联系人,每个联系人占一行,

表里有一列标识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,

从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

 

3

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

data表

Ø 该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表保存了两个ID:MimeTypeID和RawContactID,从而将data表和raw_contacts表联系起来。

Ø 联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。



/*** 查看所有联系人* */public void checkClick(View view){ll = (LinearLayout) findViewById(R.id.ll);//2个关键的URIUri uri = Uri.parse("content://com.android.contacts/raw_contacts");Uri dataUri = Uri.parse("content://com.android.contacts/data");//1.去raw_contacts获取联系人的_idCursor query = getContentResolver().query(uri, new String[]{"_id"}, null, null, null);if(query != null && query.getCount() > 0){while(query.moveToNext()){//从cursor结果集的第一位得到idint id = query.getInt(0);//SQL查询语句    select * from raw_contact where _id = ?String selection = "raw_contact_id = ?";String[] selectionArgs = {String.valueOf(id)};//查询结果集cursorCursor cursor = getContentResolver().query(dataUri, new String[]{"data1","mimetype"}, selection, selectionArgs, null);if(cursor!=null && cursor.getCount() > 0){//从cursor中取出我们需要的联系人姓名和电话while(cursor.moveToNext()){String data1 = cursor.getString(0);String mimetype = cursor.getString(1);String tag = "联系人:";TextView tv = new TextView(this);if("vnd.android.cursor.item/phone_v2".equals(mimetype)){						//	Log.i(tag , "电话:" + data1);tv.setText( "【 电话: " + data1);}else if("vnd.android.cursor.item/name".equals(mimetype)){//	Log.i(tag,"姓名:" + data1);tv.setText("     姓名: " + data1 + " 】");}ll.addView(tv);}cursor.close();}}query.close();}}


/*** 添加联系人* */public void addClick(View view){Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");Uri dataUri = Uri.parse("content://com.android.contacts/data");int contact_id = 0;//向raw_contacts表中增添一条数据//1.首先要知道已经有了多少条数据,我们要往第多少条id上插入数据Cursor cursor = getContentResolver().query(uri, new String[]{"contact_id"}, null, null, "contact_id desc limit 1");if(cursor != null && cursor.moveToFirst()){//获取当前通讯录中人数最大值contact_id = cursor.getInt(0);contact_id ++;cursor.close();//先往raw_contacts表中插入idContentValues values = new ContentValues();values.put("contact_id", contact_id);getContentResolver().insert(uri, values);//2.raw_contacts表中有了我们要添加的id,就可以往data表中那个id对应的地方添加数据/*添加数据时需要三个值:mimetype, 		data1对应的类型data1,			数据raw_contact_id	要插入的地方,也就是之前得到的那个id*///存入号码values = new ContentValues();values.put("mimetype","vnd.android.cursor.item/phone_v2" );values.put("data1", "55555555555");values.put("raw_contact_id", contact_id);getContentResolver().insert(dataUri, values);//存入姓名values = new ContentValues();values.put("mimetype","vnd.android.cursor.item/name" );values.put("data1", "我我我我我我我");values.put("raw_contact_id", contact_id);getContentResolver().insert(dataUri, values);//存入邮箱values = new ContentValues();values.put("mimetype","vnd.android.cursor.item/email_v2" );values.put("data1", "wo555@555.com");values.put("raw_contact_id", contact_id);getContentResolver().insert(dataUri, values);}Toast.makeText(this, "添加成功 :" + contact_id, 0).show();}



这篇关于Android ContentProvider之联系人数据库及操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023413

相关文章

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

MySQL MHA集群详解(数据库高可用)

《MySQLMHA集群详解(数据库高可用)》MHA(MasterHighAvailability)是开源MySQL高可用管理工具,用于自动故障检测与转移,支持异步或半同步复制的MySQL主从架构,本... 目录mysql 高可用方案:MHA 详解与实战1. MHA 简介2. MHA 的组件组成(1)MHA

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A