getContentResolver()内容解析者查询联系人

首先,我们需要知道的两个Uri:

1、Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");//查到data表中raw_contact_id

2、Uri uri1 = Uri.parse("content://com.android.contacts/data");

想取数据库里面的信息,就必须要知道表的结构我们看一下view_data表:

我们只需要关心下面三列数据:

从表中我们可以看出,Google将联系人信息放在了一列中,也就是data1列,根据raw_contact_id来区分是否为同一个人的信息,根据mimetype区分联系人信息中的name、phone、email,所以首先我们要获得的是raw_contact_id,但是view_data表中的raw_contact_id是重复的。

下面我们再来看一张表raw_contacts:

从这张表中,我们可以获得联系人的raw_contact_id,也就可以获得联系人的个数,然后通过raw_contact_id获取每个联系人。

表的结构了解了,下面我们来看代码:

 1     public void readContacts(){
 2         String name = null;
 3         String phone= null;
 4         String eMail= null;
 5         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
 6         Uri uri1 = Uri.parse("content://com.android.contacts/data");
 7         Cursor cursor = getContentResolver().query(uri,new String[]{"contact_id"},null,null,null);
 8         while (cursor.moveToNext()){
 9             String contacts_id = cursor.getString(0);
10             //System.out.println("contact_id :"+contacts_id);
11
12             if (contacts_id!=null){
13                 /**
14                  * projection  第二个参数,要查询的列,为null则是查询所有的列
15                  * selection    第三个参数,根据什么条件查询
16                  * selectionArgs    第四个参数,根据什么查的参数
17                  *
18                  */
19                 Cursor cursor1 = getContentResolver().query(uri1,new String[]{"data1","mimetype"},"raw_contact_id=?",new String[]{contacts_id},null);
20                 while (cursor1.moveToNext()){
21                     String data1 = cursor1.getString(0);
22                     String mimetype = cursor1.getString(1);
23                     //System.out.println("data1:"+data1+"--"+"mimetype:"+mimetype);
24                     if (mimetype.equals("vnd.android.cursor.item/name")){
25                         name = data1;
26                     }else if (mimetype.equals("vnd.android.cursor.item/phone_v2")){
27                         phone = data1;
28                     }else if (mimetype.equals("vnd.android.cursor.item/email_v2")){
29                         eMail = data1;
30                     }
31
32                 }
33                 System.out.println("name:"+name+"- phone:"+phone+" -email:"+eMail);
34             }
35         }
36     }

记得加权限:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

从代码中,我们可以看的很清楚,先获取raw_contact_id,然后通过他,获取data1和mimetype,然后通过mimetype知道data1中的数据是name、phone或者email。

ps:其实解析data表就是解析view_data
时间: 2024-08-07 04:32:03

getContentResolver()内容解析者查询联系人的相关文章

内容提供者ContentProvider和内容解析者ContentResolver

简介 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查.关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据.那么,这里为何要使用ContentProvider 对

内容提供者(获取联系人信息和插入联系人)

一丶获取联系人的信息 点击获取联系人信息 public void click(View view){        //获取内容解析器        ContentResolver resolver = getContentResolver() ;        //设定访问的uri(系统本机)        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts") ;//联系人的id        Uri d

SSDP协议内容解析

SSDP(Simple Service Discovery Protocol),简单服务发现协议,用于发现局域网里面的设备和服务. SSDP消息分为设备查询消息.设备通知消息两种,通常情况下,使用更多地是设备查询消息. 1.设备查询消息: 格式例子如下: M-SEARCH * HTTP/1.1 HOST: 239.255.255.250:1900 MAN: "ssdp:discover" MX: 5 ST: ssdp:all 其中第一行是消息头,固定:HOST对应的是广播地址和端口,2

IdentityServer4源码解析_5_查询用户信息接口

目录 IdentityServer4源码解析_1_项目结构 IdentityServer4源码解析_2_元数据接口 IdentityServer4源码解析_3_认证接口 IdentityServer4源码解析_4_令牌发放接口 IdentityServer4源码解析_5_查询用户信息接口 [IdentityServer4源码解析_6_结束会话接口] [IdentityServer4源码解析_7_查询令牌信息接口] [IdentityServer4源码解析_8_撤销令牌接口] 协议简析 UserI

文件内容解析

下面是我的第一个React Native程序,也是自己对该程序的文件内容解析一些理解,注释很清楚哟,相信你一看就懂!!!! /** * Sample React Native App * https://github.com/facebook/react-native * @flow */ // 1.引入组件 import React, { Component } from 'react'; import { AppRegistry, // 注册 StyleSheet, // 样式 Text,

incallui中如何查询联系人数据

联系人信息显示在CallCard中,提示当前正在通话的联系人号码.姓名.头像.号码类型等信息: 代码中在两个地方发起对当前联系人的查询, Init():startContactInfoSearch(call, true, call.getState() == Call.State.INCOMING); // 界面第一次启动 onStateChange():maybeStartSearch(mPrimary, true); // call状态改变,primary call has changed

Android CursorAdapter 查询联系人过滤

一.使用sqlite 数据库查询时,用于模糊查询的方法 like % : 表示有0个或多个字符 _  : 表示1个字符 二.去掉联系人电话号码中的空格: "replace"(data1, ' ', '') LIKE '13_________' 三.查询符合手机号码格式的号码 public Loader<Cursor> onCreateLoader(int id, Bundle args) { String phone = "\"replace\"

解析URL查询字符串参数为对象

高程3使用拼接字符串形式解析的查询字符串,网上有各种正则方式解析的,记得太多,临时需要写的时候,自己都搞混乱了.只记一种吧,用正则. function getQueryStringArgs() { var search = (location.search.length > 0 ? location.search.slice(1) : ""); var obj = {}; var reg = /([^?&=]+)=([^?&=]*)/g; search.repla

php将某一模板内容解析过后,并获取其返回值

在PHP中,将一个模板文件(.php)文件定义过后,如果要将参数传入,并且将该文件解析过后的内容作为返回值,可以php操作缓冲区来获取该模板文件的结果 //打开缓冲区 ob_start(); //引入所需要的模板文件 include('file_name.tpl.php');          //获取缓冲区中的内容,并且将该内容赋值给一个变量 $return_info = ob_get_contents(); //清空(擦除)缓冲区并关闭输出缓冲                     ob_