Android学习笔记 四七 Content Provider初谈和Android联系人信息

本文主要是介绍Android学习笔记 四七 Content Provider初谈和Android联系人信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

Content Provider

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

Content provider使用Uri的方式来定位信息。以“content://”开头来表明这是一个content URI。例如“content://contstans/5”,其中“content://constans”称为base URI,相当于数据的namespace,它的结构可以更为复杂,可以有多层结构。例子中的“5”,则是具体实例的标识。

一般来讲,Android的数据存储有4种方式:

1、 Preferences,参见Preference的使用,通常都是键值对(name-value pair)。
2、文件:在手机设备或者外设上存储,缺省的只能由创建的应用访问。
3、数据库(RDBMS):SQLite方式,参见SQLite的使用,由创建的应用访问。
4、网络:Android提供API远程在服务器上存储数据。

如果我们需要在应用中共享,采用Content Provider。无论数据具体的存储方式,Content Provider提供了一个统一的接口。数据将采用类表格的方式提供,有行有列,列表示不同属性的数据,例如电话号码、电邮地址等。每个记录(每行)都有一个唯一的_ID字段来标识。在以后具体的代码中看更直观看出。

原生providers

Android提供一些原生的content provider,来往问系统中的视频、图像和联系人信息等等。例如联系人的URI为“content://com.android.contacts/contacts”,原生的providers一般都有定义,例如联系人为ContactsContract.Contacts.CONTENT_URI。由于系统不同版本可能会存在差异,我们应尽可能使用系统的定义。

在android.provider的包中,可以查看原生的provider,例如有AlarmClock、Browser、CalendarContract、CallLog、ContactsContract(包括有Contacts,Groups,PhoneLookup等)、MediaStore(Audio 『Albums、Artists、Genres、Playlists』、Files、Images、Video)和Setting。

通过Content Providers读取信息

我们利用原生provider联系人来看看如何来读取信息,联系人的数据结构比较复杂,后面会详细介绍,这里我们将尽可能简化,先对Content Provider有个直观的认识。核心是通过managedQuery( )来获取Cursor。Cursor实际返回是一个二维的表格,有行有列,行是具体的元素,列是该元素具体的属性。整个方式和SQLite非常相似。

//可以很方便将Cursor的内容映射到ListActivity上,具体参见Android学习笔记(四十二):SQLite,ListView,ContextMenu
public class Chapter26Test1 extendsListActivity {
    private String[] INFO = new String[]{
        ContactsContract.Contacts._ID, //对于Content Provider返回数据表格而言,注意唯一标识_ID通常是必须读取的,否则很容易报错
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.Contacts.HAS_PHONE_NUMBER
    };
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /* managedQuery( )从Content Provider读取数据
         * 第1参数表示URI,
         * 第2参数表示所需读取的信息,;
         * 第3个参数是限制条件,类似SQL中的WHERE;
         * 第4个参数和第3个参数配合使用,具体支持第三个参数中的“?”具体为何;
         * 第5个参数类似于SQL中的ORDER BY */

        Cursor contactCursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,INFO, null,null,null);
        ListAdapter adapter = new SimpleCursorAdapter(this,
                                                  R.layout.chapter_22_test1,contactCursor,
                                                  new String[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts.HAS_PHONE_NUMBER},
                                                  new int[]{R.id.c22_name,R.id.c22_gravity});
        setListAdapter(adapter); //偷偷懒,本例子直接利用了Android学习笔记(四十二)中SQLite例子中的xml
    }
}

说说Android联系人信息的组织结构及读取

这是Android给出的联系人组织结构图。分为三层。

第一层,Contact,即ContactContract.Contacts,是整合的联系人信息。

第二层,RawConact,即ContactContract.RawContact,记录的是该联系人来自某信息源的信息,例如本地输入的,来自Google的,从微软Exchange中导出的,或则来自某个社交网站的信息。每个RawContact记录的信息都来自同一信息源。

第三层,Data,即ContactContract.Data,是具体的信息存储,例如记录联系人姓名,email信息,家庭电话,手机电话信息等等,每一个Data都存放一个具体的信息。在Data中的MIME TYPE说明存储信息的类型。具体在ContactContract.CommonDataKinds中定义。每个Data中有DATA1-DATA15个字段来存储信息,各字段所代表的含义,也可以在CommonDataKinds中具体查到。

下面,我们一层一层地读取联系人信息,将更清晰地看到这个结构。要读取详细信息,对于Content Privider,关键是Uri逐层定位,才能获取信息。为了清晰表述,我们将整个路径写出来。

第一层信息,将返回联系人列表中的多个Contacts,Uri为ContactsContract.Contacts.CONTENT_URI

private String[] INFO_1= new String[]{
    ContactsContract.Contacts._ID,//这是每个row,也就是每个联系人的唯一的ID标识
    ContactsContract.Contacts.DISPLAY_NAME,
};
Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,INFO_1,null,null,null);

cursor是表格形式,每一个行表示一个联系人。要读取哪些列,在第二个参数String[]中定义。可以选取那些列,在Android Reference中的ContactsContract.Contacts中的Column中可以查到。最关键的列信息为_ID,它是行,也就是每个联系人的唯一标识。除此之外,每个联系人的信息会根据旗下的RawContact进行整合,因此,我们可以查到联系的名字ContactsContract.Contacts.DISPLAY_NAME等。

利用Contacts._ID,我们可以检索第二层的信息。

第二层信息,将返回某联系人的多个RawContacts

同样,返回表格中的列,可以查看ContactsContract.RawContacts中查看。我们选取下面的信息,此外,如果要查看信息的来源,例如来自com.google,可通过RawContacts.ACCOUNT_TYPE和RawContacts.ACCOUNT_NAME两个列查看。

private String[ ] INFO_2 = {
    ContactsContract.RawContacts._ID, //这是RawContact的唯一标识
    ContactsContract.RawContacts.CONTACT_ID, //这是该RawContact关联的Contact._ID
};

通过查询全部的RawContacts,通过条件检索,要求联系人的ID为指定的某联系人。在下面的例子在managedQuery中给出了param3和param4的条件,注意参数3,如果我们有多个条件,可以用AND等逻辑符合进行表述。

Cursor cursor = managedQuery(ContactsContract.RawContacts.CONTENT_URI ,
                                                     INFO_2 ,
                                          RawContacts.CONTACT_ID + "=?" ,
                                          new String[]{String.valueOf(contactId)} ,
                                                    null);

通过RawContacts._ID,我们可以往下检索RawContacts下面各Data的信息内容。

第三层信息:将返回某RawContact的各Data的信息

可查询各列的信息见ContactsContract.Data的介绍。

private String INFO_3[] = {
    ContactsContract.Data._ID, //这是Data信息块的唯一标识
    ContactsContract.Data.CONTACT_ID, //关联第一层信息的CONTACT_ID
    ContactsContract.Data.RAW_CONTACT_ID, //关联第二层信息的RAW_IDCONTACT_ID
    ContactsContract.Data.MIMETYPE, //具体含义可查ContactsContract.CommonDataKinds
    ContactsContract.Data.DATA1, //通常读取DATA1就可以,在具体的ContactsContract.CommonDataKinds.Phone/Email等查到DATA1-DATA15的含义
    ContactsContract.Data.DATA2,
    … …
    ContactsContract.Data.DATA15,
};

读取的方式有两种。

方式一:指定定具体的Uri:

Uri rawContactUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawId);
Uri dataUri = Uri.withAppendedPath(rawContactUri,ContactsContract.RawContacts.Data.CONTENT_DIRECTORY);
Cursor cursor = managedQuery( dataUri, INFO_3,null, null, null);

方式二:另一种是利用RawContacts_ID或者Contact_ID,通过Data.CONTENT_URI,具体方式类RawContacts的检索。

Cursor cursor = managedQuery(ContactsContract.Data.CONTENT_URI ,
                                                     INFO_3 ,
                                          ContactsContract.Data.RAW_CONTACT_ID + "=?" ,
                                          new String[]{String.valueOf(rawId)} ,
                                                    null);

总结一下架构图。实际上Android的联系人提供了多种URI的的查询方式,具体参加Android的reference。

相关链接:我的Andriod开发相关文章


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述

这篇关于Android学习笔记 四七 Content Provider初谈和Android联系人信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学