上次把联系人的表都打开看了看,也了解了些东西
现在要开始编程了
要从联系人当中提取哪些信息呢?
ID 看起来没用的数据
显示的名字
名
姓
(中间名可以省咯了,中国人基本用不到)
电话
更多电话(家里,工作,等等)
电子邮件(家里,工作,等等)
即时通信(QQ,MSN,Skype,Gtalk,等等)
通讯地址
昵称
备注
网站
更重要的一个东西就是数据的版本号,就是上次我们看到很高兴的那个字段version
data表中有个version字段,raw_contacts表中有个version字段,contacts表中没有
这样只需要我们构建一张表来记录相关数据,我们就能知道哪些数据是在某个时间点后变化过的
如果牛逼的话,就HACK联系人的数据库,给它加个触发器来更改我们表的数据,当然我们的表得放在联系人的数据库当中,又不能像Oracle样建个DATABASE LINK,但是这基本是不可能的
扯远了
现在我们首要任务是在API中把那些对应的字段找出来,把数据读出来
上次我们在分析表的时候发现对于id有很多引用,比如raw_contacts中的contact_id就引用了contacts中的id,并且data中的raw_contact_id又引用了raw_contacts中的_id,这其实还是个比较重要的信息
我们就可以知道,在所有的数据当中,contacts是最开始的,它是起源,虽然它本身不带有很多数据,但是他的作用不可忽视
所以
ID <----------> ContactsContract.Contacts._ID
看看ContactsContract.Contacts._ID的注释我们也可以理解,The unique ID for a row. INTEGER (long)
显示的名字 <----------> ContactsContract.Contacts.DISPLAY_NAME
名 <----------> ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME
姓 <----------> ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME
看了下表的数据,data表中有条数据是
9||9|1|0|0|0|海 郭|海|郭||||||||||||||||
第三列对应于mimetype,查下mimetype表之后9对应于vnd.android.cursor.item/name
那么我们只需要根据ID和类型查询出这条数据,然后再取出第九列和第十列的数据就应该OK了,第八列是显示的名字
即DATA2(名)和DATA3(姓)
SDK已经帮我们封装好了就是ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME和ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME
那么读出联系人数据的代码就应该可以是如下这个样子的
private List showContacts() {
Cursor cursor = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
while (cursor.moveToNext()) {
String contactId = cursor
.getString(cursor
.getColumnIndex(ContactsContract.Contacts._ID));
String dn = cursor
.getString(cursor
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Log.v("DISPLAY NAME", dn);
// ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYP,表示是姓名系
Cursor names = getContentResolver()
.query(
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID
+ " = ? AND "
+ ContactsContract.Data.MIMETYPE
+ " = ?",
new String[] {
contactId,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE },
null);
// + " AND " + ContactsContract.Data.MIMETYPE + " = 9"
// 非要这么写才出来,用什么数值,或者StructuredName不放在selectionArgs都出不来,想知道它是如何拼写SQL的?
while (names.moveToNext()) {
// 名
String gn = names
.getString(names
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
Log.v("GIVEN NAME", gn);
// 姓
String fn = names
.getString(names
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
Log.v("FAMILY NAME", fn);
// 姓名数据版本
String versions = names
.getString(names
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DATA_VERSION));
Log.v("DATA VERSION", versions);
}
names.close();
// 查询RawContacts,这个里面有版本号version,关键字段
Cursor raws = getContentResolver()
.query(
ContactsContract.RawContacts.CONTENT_URI,
null,
ContactsContract.RawContacts.CONTACT_ID
+ " = ?",
new String[] { contactId, },
null);
while (raws.moveToNext()) {
String rawVersion = raws
.getString(raws
.getColumnIndex(ContactsContract.RawContacts.VERSION));
Log.v("RAW VERSION", rawVersion);
}
raws.close();
String hasPhone = cursor
.getString(cursor
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if ("1".equals(hasPhone)) {
Cursor phones = getContentResolver()
.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = "
+ contactId,
null, null);
while (phones.moveToNext()) {
String phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.v("phone", phoneNumber);
}
phones.close();
}
Cursor emails = getContentResolver()
.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = "
+ contactId,
null, null);
while (emails.moveToNext()) {
String emailAddress = emails
.getString(emails
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); // 如何获取Email地址
// 为什么ADDRESS这个字段不能用?Unhide in a separate CL
Log.v("email", emailAddress);
String version = emails
.getString(emails
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA_VERSION));
Log.v("email version", version);
}
emails.close();
}
cursor.close();
return null;
}
分享到:
相关推荐
探讨基于移动互联网的人体解剖学第二课堂建设.pdf
【基于Android平台的校园通软件】毕业论文主要探讨了如何利用Android操作系统开发一款适用于校园环境的通用软件。本文首先从国内外手机系统的发展现状及其应用情况出发,分析了Android平台在移动应用开发中的重要...
根据提供的文件信息,这里将基于“最全,最经典的人体解剖图”这一主题进行展开,探讨人体解剖学中的关键知识点。 ### 一、人体解剖学概述 人体解剖学是研究人体结构的一门学科,它帮助我们了解身体各部位的位置、...
人体解剖学是医学领域中不可或缺的一门基础学科,它涉及对人类身体结构的深入研究,包括骨骼、关节、肌肉、内脏器官等各系统的组成和布局。为了帮助医学生和相关专业人员有效掌握这些知识,学习题集起到了至关重要的...
在探讨“最全人体解剖图”这一主题时,我们实际上是在深入研究人体结构的奥秘,这不仅是医学教育的基础,也是法医学、生物科学、艺术创作等多个领域不可或缺的知识体系。解剖学作为一门研究生物体各部分结构的学科,...
在医学教育的众多领域中,解剖学无疑是最为基础且关键的学科之一。了解人体的结构、组织以及器官的工作原理是任何医生、护士、康复治疗师乃至医学生必须掌握的基本知识。随着科技的进步,传统的解剖学习方式也在发生...
《C语言深度解剖》是两本专注于C语言学习与进阶的重要著作,第一版和第二版的结合为读者提供了全面而深入的C语言知识体系。这个压缩包包含的资源,"C语言总结",是对C语言基础知识的精炼概述,涵盖了C语言的关键概念...
Three.js 是一个基于 WebGL 的 JavaScript 库,它为Web开发人员提供了一个在浏览器中创建3D图形的强大工具。这个“three.js的人体解剖图”压缩包,很显然是一个利用Three.js库来展示人体结构的3D可视化项目。下面...
传统的解剖学学习依赖于实体标本和教科书中的二维图像,这种方式不仅成本高,且难以提供全面、立体的理解。而3dBody软件则通过三维可视化技术,将复杂的解剖结构以立体、互动的方式呈现出来,使学习者能够从不同角度...
传统的二维图像往往限制了我们对物体的理解,而MediView则打破了这种局限,让用户可以从任何角度观察人体解剖,如同置身于一个虚拟的解剖室中。这种沉浸式体验极大地增强了学习和创作的效率。 在使用MediView时,...
【标题】"人体解剖三维动画"涉及到的领域是生物医学和数字技术的交叉,主要应用于教育、医疗和科研场景。这种技术通过三维动画的形式,将人体内部结构以直观、立体的方式呈现出来,有助于学习者理解和掌握人体解剖学...
根据给定文件的信息,本文将围绕“3D针灸穴位图(人体解剖图)”这一主题进行深入探讨。此PDF文档为转载作品,并非商业用途,而是出于分享的精神。以下将详细介绍与该主题相关的知识点。 ### 一、3D人体解剖学软件 ...
在运动解剖学考研精讲的第二十二讲中,我们主要探讨的是体育动作的解剖学分析,这是理解和评估运动员技能、预防运动伤害以及优化训练计划的关键。这一讲的内容将深入到人体运动机制的微观层面,揭示不同肌肉、骨骼和...
### C语言深度解剖知识点解析 #### 一、引言:C语言的重要性及现状分析 在当前快速发展的信息技术领域中,编程语言作为实现各种软件应用的基础工具,扮演着至关重要的角色。C语言作为一门历史悠久且功能强大的编程...
传统的解剖学教学通常依赖于二维的教科书插图或实体标本,而3D技术能够创建出高度逼真的三维模型,让学生能够全方位、多角度地观察人体结构。例如,通过3D软件,可以旋转模型、放大细节,甚至模拟切割过程,帮助学生...
背景:越来越多的证据支持不同医学专业的学生跨专业教育(IPE... 百分之一百的CRNA学生发现以尸体为基础的解剖学课程是有益的,并认为该课程增强了他们对人体解剖学的三维理解,他们认为这对将来的麻醉程序将是有益的。
"基于VRML JavaScript的交互式《人体解 剖学》3D虚拟实验室的构建及应用" ...本文介绍了基于VRML JavaScript的交互式《人体解剖学》3D虚拟实验室的构建及应用,旨在提高学生的学习兴趣和学习效率,推动教学改革。