Contact类解析
Contact类 public static class Contacts implements BaseColumns, ContactsColumns,
ContactOptionsColumns, ContactNameColumns, ContactStatusColumns
对Contacts表共17项数据:
变量名 列名 备注
_ID _id
LOOKUP_KEY lookup
NAME_RAW_CONTACT_ID参照@1
DISPLAY_NAME display_name 在Contacts对列的描述为DISPLAY_NAME_PRIMARY
PHOTO_ID photo_id
IN_VISIBLE_GROUP in_visible_group
HAS_PHONE_NUMBER has_phone_number
TIMES_CONTACTED times_contacted
LAST_TIME_CONTACTED last_time_contacted
STARRED starred
CUSTOM_RINGTONE custom_ringtone
SEND_TO_VOICEMAIL send_to_voicemail
CONTACT_PRESENCE contact_presence
CONTACT_STATUS contact_status
CONTACT_STATUS_TIMESTAMP contact_status_ts
CONTACT_STATUS_RES_PACKAGE contact_status_res_package
CONTACT_STATUS_LABEL contact_status_label
CONTACT_STATUS_ICON contact_status_icon
注意1:在Contacts对列的描述有NAME_RAW_CONTACT_ID,但没找到相应的变量和列名。
可能ContentResolver觉得把该项暴露给用户每什么意义,就把它隐藏起来了。该项应该是只给系统内部用的哦。
注意2:只有五项是可写TIMES_CONTACTED, LAST_TIME_CONTACTED, STARRED, CUSTOM_RINGTONE, SEND_TO_VOICEMAIL.
Operations
数据插入
A Contact cannot be created explicitly. When a raw contact is inserted, the provider will first try to find a Contact representing the same person.
If one is found, the raw contact's CONTACT_ID column gets the _ID of the aggregate Contact.
If no match is found, the provider automatically inserts a new Contact
and puts its _ID into the CONTACT_ID column of the newly inserted raw contact.
用户部能直接插入数据。数据的插入是由系统自动来完成的。
当raw contact被插入或时,系统就会检查是否可以把该raw contact加到已经有的组(contact)。
如果找到可以加入的组,就把组ID写到raw contact的CONTACT_ID这个数据项中。
如果没找到就由系统重新创建一组,并把组ID写到raw contact的CONTACT_ID这个数据项中。
如果raw contact的structured name, organization, phone number, email address, or nickname被改变。
系统就会检查raw contact是否还属于raw contact的CONTACT_ID标记的那个组。
如果发现raw contact不属于raw contact的CONTACT_ID标记的那个组。
那么系统就会找是否可以把该raw contact加到已经有的其他组(contact)
如果找到可以加入的组,就把组ID写到raw contact的CONTACT_ID这个数据项中。
如果没找到就由系统重新创建一组,并把组ID写到raw contact的CONTACT_ID这个数据项中。
注意:这的组是指contact(Aggregation of raw contact)
数据更新
自动更新:当contact所包含的RawContacts的信息发生改变时,系统会对contact做相应的更新。
手动强制更新:
Only certain columns of Contact are modifiable: TIMES_CONTACTED, LAST_TIME_CONTACTED, STARRED, CUSTOM_RINGTONE, SEND_TO_VOICEMAIL. Changing any of these columns on the Contact also changes them on all constituent raw contacts.
只有五项是可被用户直接更新。它们是TIMES_CONTACTED, LAST_TIME_CONTACTED, STARRED, CUSTOM_RINGTONE, SEND_TO_VOICEMAIL。
当它们被手动强制更新时,contact所包含的RawContacts的相应项也会被一起更新。
数据删除
Contacts文档说:
Be careful with deleting Contacts! Deleting an aggregate contact deletes all constituent raw contacts.
The corresponding sync adapters will notice the deletions of their respective raw contacts
and remove them from their back end storage.
删除一个Contacts,会把它所包含所有raw contacts都删除掉。
但是用下面语句居然删除不了任何Contacts.
getContentResolver().delete(Contacts.CONTENT_URI, null,
null);
不过在删除Contacts的所有raw contacts后,Contacts也被删除了。
Query
* If you need to read an individual contact, consider using CONTENT_LOOKUP_URI instead of CONTENT_URI.
* If you need to look up a contact by the phone number, use PhoneLookup.CONTENT_FILTER_URI, which is optimized for this purpose.
* If you need to look up a contact by partial name, e.g. to produce filter-as-you-type suggestions, use the CONTENT_FILTER_URI URI.
* If you need to look up a contact by some data element like email address, nickname, etc,
use a query against the ContactsContract.Data table. The result will contain contact ID, name etc.
可用如下语句进行查询:
Cursor c=getContentResolver().query(Contacts.CONTENT_URI, null,
null, null, Contacts.DISPLAY_NAME + " COLLATE NOCASE");
注意1:对于查单个contact信息时,可用CONTENT_LOOKUP_URI来进行查询
注意2:对于想通过电话号码查询时,可用PhoneLookup.CONTENT_FILTER_URI来查询。
具体参照《用PhoneLookup进行电话号码查询》
注意3:对于想通过名字的模糊查询来查询时,可以CONTENT_FILTER_URI URI来查询。
注意4: 对于想通过email address, nickname来查询时,可查询ContactsContract.Data表。
它的查询结果里面包含了contact ID, name等信息。具体可参考《raw contact子表数据查询》
注意5:可以使用CONTENT_STREQUENT_URI来查询starred和经常联系的联系人信息
关于Contact的Uri介绍.
CONTENT_LOOKUP_URI
public static final Uri CONTENT_LOOKUP_URI = Uri.withAppendedPath(CONTENT_URI, "lookup");
A content:// style URI for this table that should be used to create shortcuts or otherwise create long-term links to contacts.
This URI should always be followed by a "/" and the contact's LOOKUP_KEY. It can optionally also have a "/" and last known contact ID appended after that. This "complete" format is an important optimization and is highly recommended.
As long as the contact's row ID remains the same, this URI is equivalent to CONTENT_URI.
If the contact's row ID changes as a result of a sync or aggregation, this URI will look up the contact using indirect information (sync IDs or constituent raw contacts).
Lookup key should be appended unencoded - it is stored in the encoded form, ready for use in a URI.
例如下:
content://com.android.contacts/contacts/lookup/0n/400
注意:"On"是lookUpKey,"400"是Contacts._ID
得到CONTENT_LOOKUP_URI的方式有:
1,从数据库中取得lookUpKey,然后再合成lookUpUri
Cursor c=getContentResolver().query(Contacts.CONTENT_URI, null,
null, null, Contacts.DISPLAY_NAME + " COLLATE NOCASE");
Long contactId=cursor.getLong(cursor.getColumnIndex(Contacts._ID));
//注意这里的lookUpKey是从Contacts表中取的
String lookUpKey=cursor.getString(cursor.getColumnIndex(Contacts.LOOKUP_KEY));
Uri lookUpUri=Contacts.getLookupUri(contactId, lookUpKey);
Cursor c = context.getContentResolver().query(lookUpUri, null,
null, null, Contacts.DISPLAY_NAME + " COLLATE NOCASE");
2,先用contactId合成contactUri,再用contactUri然后再合成lookUpUri.
Uri contactUri=ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
Uri lookUpUri=Contacts.getLookupUri(context.getContentResolver(), contactUri);
另外可以从lookUpUri得到contactUri。
public static Uri lookupContact (ContentResolver resolver, Uri lookupUri)
Since: API Level 5
Computes a content URI (see CONTENT_URI) given a lookup URI.
Returns null if the contact cannot be found.
这里返回的是具体一个联系人的CONTENT_URI比如:content://com.android.contacts/contacts/400
CONTENT_URI
public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "contacts");
全部contacts
全部contacts就是Contacts.CONTENT_URI(content://com.android.contacts/contacts)
某个人contacts
具体某个人就是Contacts.CONTENT_URI/contactId的形式。
比如:
content://com.android.contacts/contacts/400
某个人contacts可用如下方式合成
Uri contactUri=ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
也可用它对具体一个人进行查询
Cursor c = context.getContentResolver().query(contentUri, null,
null, null, Contacts.DISPLAY_NAME + " COLLATE NOCASE");
CONTENT_FILTER_URI
public static final Uri CONTENT_FILTER_URI = Uri.withAppendedPath(CONTENT_URI, "filter");
The content:// style URI used for "type-to-filter" functionality on the CONTENT_URI URI.
The filter string will be used to match various parts of the contact name.
The filter argument should be passed as an additional path segment after this URI.
用于对名字进行模糊查询。
String name="robin";
Uri uri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(name));
c=context.getContentResolver().query(uri, null,null,null,null);
CONTENT_STREQUENT_URI
public static final Uri CONTENT_STREQUENT_URI = Uri.withAppendedPath(CONTENT_URI, "strequent");
The content:// style URI for this table joined with useful data from ContactsContract.Data,
filtered to include only starred contacts and the most frequently contacted contacts.
它也是用于对联系人进行查询,但是只返回starred和经常联系的联系人信息。
比如:
c=context.getContentResolver().query(Contacts.CONTENT_STREQUENT_URI, null,null,null,null);
返回的列和CONTENT_URI查询一样,也是17项数据。
CONTENT_STREQUENT_FILTER_URI
public static final Uri CONTENT_STREQUENT_FILTER_URI = Uri.withAppendedPath(CONTENT_STREQUENT_URI, "filter");
The content:// style URI used for "type-to-filter" functionality on the CONTENT_STREQUENT_URI URI.
The filter string will be used to match various parts of the contact name.
The filter argument should be passed as an additional path segment after this URI.
它是用于通过名字来对联系人进行模糊查询,但是只返回starred和经常联系的联系人信息。
比如:
String name="robin";
Uri uri = Uri.withAppendedPath(Contacts.CONTENT_STREQUENT_FILTER_URI, Uri.encode(name));
c=context.getContentResolver().query(uri, null,null,null,null);
返回的列和CONTENT_URI查询一样,也是17项数据。
Contact类解析的更多相关文章
- Bootstrap 类解析
Bootstrap 类解析 元素 Bootstrap 类 定义 <div> container 内容容器 <table> table 表格 <table> tabl ...
- 【Owin 学习系列】2. Owin Startup 类解析
Owin Startup 类解析 每个 Owin 程序都有 startup 类,在这个 startup 类里面你可以指定应用程序管道模型中的组件.你可以通过不同的方式来连接你的 startup 类和运 ...
- Thrift compiler代码生成类解析
代码生成类解析: Thrift--facebook RPC框架,介绍就不说了,百度,google一大把,使用也不介绍,直接上结构和分析吧. Hello.thrift文件内容如下: namespace ...
- SpringBoot入门(三)——入口类解析
本文来自网易云社区 上一篇介绍了起步依赖,这篇我们先来看下SpringBoot项目是如何启动的. 入口类 再次观察工程的Maven配置文件,可以看到工程的默认打包方式是jar格式的. <pack ...
- Spark 资源调度包 stage 类解析
spark 资源调度包 Stage(阶段) 类解析 Stage 概念 Spark 任务会根据 RDD 之间的依赖关系, 形成一个DAG有向无环图, DAG会被提交给DAGScheduler, DAGS ...
- 【Spring注解驱动开发】AOP核心类解析,这是最全的一篇了!!
写在前面 昨天二狗子让我给他讲@EnableAspectJAutoProxy注解,讲到AnnotationAwareAspectJAutoProxyCreator类的源码时,二狗子消化不了了.这不,今 ...
- 【Python】-【类解析】--【脚本实例】
通过脚本事例,解析下Python中类的几个概念在脚本中的应用 脚本如下: ++++++++++++++++++++++++++++++++++++++++ #!/usr/bin/env python# ...
- .net HTMLParser详细使用说明 强大的Filter类 解析HTML文档如此简单
背景: HTMLParser原本是一个在sourceforge上的一个Java开源项目,使用这个Java类库可以用来线性地或嵌套地解析HTML文本.他的 功能强大和开源等特性吸引了大量Web信息提取的 ...
- Spring源码情操陶冶-AOP之Advice通知类解析与使用
阅读本文请先稍微浏览下上篇文章Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器,本文则对aop模式的通知类作简单的分析 入口 根据前文讲解,我们知道通知类的 ...
随机推荐
- Inter IPP 跟 Microsoft V100编译器区别
最近做项目用了两个编译器,由于是一种精度的算法计算,对计算的精度要求非常高,同时都用的float型,发现inter的结果比vs的结果好许多.但是不知道是什么原因,最后测试发现,是两个编译器的问题. ...
- 设计模式(二)单件模式Singleton(创建型)
SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关 ...
- <脱机手写汉字识别若干关键技术研究>
脱机手写汉字识别若干关键技术研究 对于大字符集识别问题,一般采用模板匹配的算法,主要是因为该算法比较简单,识别速度快.但直接的模板匹配算法往往无法满足实际应用中对识别精度的需求.为此任俊玲编著的< ...
- 给你的Cordova HybridApp加入Splash启动页面
如今最新的Cordova 3以上的版本号支持启动画面了,是通过cordova插件实现的. 眼下Splash插件支持android,ios,blackberry等多个平台. 加入插件等步骤例如以下: 加 ...
- ClassLoader载入指定的类需注意六个细节或报ClassNotFundEception异常总结
项目中,载入指定的类反射调用方法一直报类找不到,经过数百次的測试.对这样的问题有了一个又一次的认识,特总结.记录.分享例如以下: 1.路径中尽可能用"/"或者File.separa ...
- Java基础11 对象引用
链接地址:http://www.cnblogs.com/vamei/archive/2013/04/01/2992484.html 作者:Vamei 出处:http://www.cnblogs.com ...
- javascript笔记整理(流程控制)
流程:就是程序代码的执行顺序 流程控制:通过规定的语句让程序代码有条件的按照一定的方式执行 1.顺序结构(按照书写顺序来执行,是程序中最基本的流程结构) 2.选择结构(分支结构.条件结构):根据给定的 ...
- InPageError c000009c使用chkdsk修复磁盘
chkdsk e: /f /r 回车运行就表示修复e盘上的错误,并找到坏扇区恢复可读取的信息. 其它: [Path} FileName] 指定需要 chkdsk 检查碎片整理的文件或文件集的位置和名称 ...
- 挺苹果的声音,iPhone 5s的两处进步
苹果iPhone 5s发布后的两处重大进步让我很关注,但看了网上众多网友的点评,又深深的被中国当前手机发烧友圈的这种屌丝文化所震撼,这不是一条正确的道路,这将把中国的手机产业引向歧途,所以我不得不说几 ...
- fzu 1913 Easy Comparison(字符串)
题目链接:fzu 1913 Easy Comparison 题目大意:给出一个字符串,计算与它按照字典序排序排列后的字符串有多少个位置不同. 解题思路:水体,sort一下,然后遍历一遍就好. #inc ...