`
JasonShieh
  • 浏览: 527529 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android联系人数据库全解析(1)

阅读更多
from (http://www.higherpass.com/Android/)
Android 联系人应用

Android 联系人说明

学习应用Android联系人数据库,在掌握Android SQLite的基础上,还要熟练应用数据指针(cursor)。我们可以查看有关Android SQLite 和 Cursor的文章来获取更多的内容。谷歌(Google)更换了Android 1.x和2.x的联系人数控库版本。本文分为三节,第一节将介绍Android 2.0的联系人。第二节将介绍怎么处理Android 1.6以及以前版本的联系人。而第三节,将会把这两个版本结合起来。创建一个类来抽象各个版本的操作类,并创建一套类来对联系人记录进行管理。

在Eclipse中新建一个项目,名为TestContacts。创建Android 2.0支持。

Android 2.0联系人API

查询许可

在查询联系人数据之前。我们必须得到查询许可。方法就是在根目录的AndroidManifest.xml文件中配置如下权限:<uses-permission  android:name="android.permission.READ_CONTACTS" />

查询联系人数据库

检索联系人详细信息


为了规范化,基本的联系人信息放在联系人表里,而其他的详细信息则被储存在独立的数据表中。在Android 2.0中,要查询基本的联系人记录,URI被指定在People.CONTENT_URI变量中。  ContactsContract.Contacts.CONTENT_URI.
package higherpass.TestContacts;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;

public class TestContacts extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
        if (cur.getCount() > 0) {
	    while (cur.moveToNext()) {
	        String id = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts._ID));
		String name = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
 		if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
 		    //Query phone here.  Covered next
 	        }
            }
 	}
    }
}

这个应用像其他应用一样。首先创建一个ContentResolver实例 的引用cr。然后用这个实例去查询数据库。返回一个包含联系人列表的Cursor。这个查询URI是ContactsContract.Contacts.CONTENT_URI。然后检查是否包含数据,如果有则循环遍历。记录ID存储在id变量中,它在后面将被用做条件参数。联系人显示名称责备存储在name字符串中。想知道更多cursor的用法,请参考Android Cursor教程

手机号码
手机号码存储在自己的表中,需要单独查询。查询这个表要用到ContactsContract.CommonDataKinds.Phone.CONTENT_URI,用一个WHERE 条件从句来获得指定联系人的号码。
            if (Integer.parseInt(cur.getString(
                   cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                Cursor pCur = cr.query(
 		    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
 		    null, 
 		    ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
 		    new String[]{id}, null);
 	        while (pCur.moveToNext()) {
 		    // Do something with phones
 	        } 
 	        pCur.close();
 	    }

这里演示了一个对联系人数据的间接查询。手机号码的URI存储在ContactsContract.CommonDataKinds.Phone.CONTENT_URI中。联系人ID存储在ContactsContract.CommonDataKinds.Phone.CONTACT_ID字段中。WHERE从句是限制条件。用来限制查询结果。

电子邮箱地址

查询电子邮箱地址,跟查询手机号码相似。只是URI不同:
	Cursor emailCur = cr.query( 
		ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
		null,
		ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
		new String[]{id}, null); 
	while (emailCur.moveToNext()) { 
	    // This would allow you get several email addresses
            // if the email addresses were stored in an array
	    String email = emailCur.getString(
                      emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
 	    String emailType = emailCur.getString(
                      emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
 	} 
 	emailCur.close();

想手机号码一样,邮箱数据表也是在ContactsContract.CommonDataKinds中。查询URI是ContactsContract.CommonDataKinds.Email.CONTENT_URI 。查询的时候联系人的
id要跟ContactsContract.CommonDataKinds.Email.CONTACT_ID对应。因为邮箱地址可以为多个,所以要循环遍历查询结果。

备注

自定义备注可以被加入到联系人数据中,ContactsContract.CommonDataKinds.Email.CONTACT_ID这些被存储在独立的表中,但与联系人的ID建立了外键关联。
        String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
        String[] noteWhereParams = new String[]{id, 
 		ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; 
                Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, noteWhere, noteWhereParams, null); 
 	if (noteCur.moveToFirst()) { 
 	    String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
 	} 
 	noteCur.close();

备注被存储在Android联系人的通用data表中。当查询特定的数据时,WHERE从句需要两个条件从句。首先是标准ID,然后是MIMETYPE 。Android SDK包含了一系列自动生成的变量来维护这个字段。用ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE来限定备注记录。data表URI在ContactsContract.Data.CONTENT_UR中。最后备注的字段名保存在ContactsContract.CommonDataKinds.Note.NOTE

邮政地址

Android可以为联系人存储多个邮政地址,地址跟备注一样也是被保存在data表中,URI是ContactsContract.Data.CONTENT_URI与备注类似。我们需要一个MIMETYPE 作为WHERE条件从句。在2.0中,地址数据被分为多个区域,包含了地址的不同部分:(邮箱,街道,城市,地区,邮政编码)在Android SDK的早期版本中,这只是一个不规则的字符。
	String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
	String[] addrWhereParams = new String[]{id, 
		ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}; 
	Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI, 
                null, where, whereParameters, null); 
	while(addrCur.moveToNext()) {
		String poBox = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
 		String street = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
 		String city = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
 		String state = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
 		String postalCode = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
 		String country = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
 		String type = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
 	} 
 	addrCur.close();

这段代码与之前的例子类似。请注意该字段名称都保存在 ContactsContract.CommonDataKinds.StructuredPostal.

即时消息
即时消息的查询就像备注和地址。IM的相关数据里的主要字段名称保存在
ContactsContract.CommonDataKinds.Im
 	String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
 	String[] imWhereParams = new String[]{id, 
 	    ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; 
 	Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI, 
            null, imWhere, imWhereParams, null); 
 	if (imCur.moveToFirst()) { 
 	    String imName = imCur.getString(
                 imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
 	    String imType;
 	    imType = imCur.getString(
                 imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));
 	} 
 	imCur.close();

组织机构

最后要讲述的联系人记录是机构数据。Android 联系人记录包含的信息有雇主,专业,社会关系,以及角色与职位,这些资料记录都保存在ContactsContract.Data.CONTENT_URI主要的机构数据里的主要字段名称则保存在ContactsContract.CommonDataKinds.Organization

String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
 	String[] orgWhereParams = new String[]{id, 
 		ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}; 
 	Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI, 
                null, orgWhere, orgWhereParams, null);
 	if (orgCur.moveToFirst()) { 
 		String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
 		String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
 	} 
 	orgCur.close();
分享到:
评论
2 楼 wlmxj 2014-05-13  
你好,版主知道怎么添加吗?你写的这是查询!
1 楼 p6616298 2012-12-12  

相关推荐

    android 解析 开机加载SIM联系人及对SIM卡联系人的操作

    ### Android解析:开机加载SIM联系人及对SIM卡联系人的操作 #### 一、概述 在Android系统中,用户能够方便地访问并管理SIM卡上的联系人信息,这些功能背后涉及到了一系列复杂的交互机制和技术实现。本文将详细介绍...

    Android@联系人功能

    这通常涉及到读取Android的ContactsContract数据库,筛选出用户可能需要@的联系人信息,如姓名和唯一标识。 3. **显示联系人选择界面**:创建一个Dialog或者BottomSheet,展示联系人列表。列表项应包含联系人头像、...

    android联系人二维码生成以及扫描

    综上所述,"android联系人二维码生成以及扫描"这个主题涵盖了Android应用开发中的多个重要技术点,包括二维码库的使用、数据编码与解码、相机权限处理以及用户界面设计等。开发者通过学习和实践这些内容,能够增强其...

    Android联系人总结

    Android系统的联系人管理功能是移动通信应用中的重要组成部分,本文将详细解析Android系统中与联系人相关的数据库架构与数据存储方式,帮助开发者更好地理解和掌握Android联系人数据库的工作原理及其实现细节。...

    Android通过蓝牙使用Pbap协议读取通讯录

    VCard数据在接收到OBEX GET请求响应后会被解析,然后可以存储到Android系统的联系人数据库中。 在实际开发过程中,你需要遵循以下步骤: 1. 检查并启用蓝牙,搜索支持PBAP的远程设备,并进行配对。 2. 创建...

    Android 异步联系人备份与恢复Demo

    - 将VCard导入到联系人:Android提供Intent ACTION_INSERT_OR_REPLACE,通过startActivityForResult()启动这个Intent,传递解析后的VCard数据,系统会自动处理导入过程。也可以使用ContentResolver的insert()方法,...

    android 支持分组和联系人展示的一个小例子(类似QQ首页)

    在Android中,联系人数据通常存储在系统提供的Contacts数据库中,可以通过ContentResolver进行查询和操作。分组则是联系人的组织形式,可以将相关的联系人归类到同一个分组下,便于管理和查找。 在"ContactProject...

    android扫描名片并解析名片源码

    同时,允许用户导出名片数据为CSV或VCF格式,便于导入其他联系人管理软件。 以上就是"android扫描名片并解析名片源码"中涉及的主要知识点,涵盖了从图像处理到数据存储的全过程,体现了Android应用开发的多个技术...

    Android应用源码高仿QQ客户端加服务端加数据库全套

    2. **用户界面(UI)设计**:仿QQ客户端意味着需要创建与QQ相似的用户界面,包括聊天界面、联系人列表、消息通知等。这涉及到对Android的自定义View和Adapter的深入理解和使用,以及对Material Design设计规范的理解。...

    Android短信联系人备份并上传

    1. Android ContentResolver和SmsManager/ContactsContract用于访问短信和联系人数据。 2. 使用AsyncTask进行异步备份,实时更新UI。 3. XML文件的生成和解析,用于数据存储和传输。 4. HttpURLConnection或第三方...

    android联系人contacts模块的学习总结

    以下是对Android联系人contacts模块及相关技术的学习总结。 首先,Android平台提供了多种数据存储方式,这包括文件方式、SharedPreferences以及嵌入式关系型数据库SQLite。对于文件存储方式,Android提供了标准的...

    android 批量插入联系人、短信、通话记录,安装版,apk格式

    在Android系统中,批量操作是常见的需求,尤其是在处理大量数据如联系人、短信和通话记录时。本项目提供了一个解决方案,允许用户批量插入这些信息,特别解决了自Android 4.4版本后插入短信的限制问题。这个解决方案...

    安卓通讯录联系人打电话归属地相关-集成了省份城市银行银行支行联行号的android数据库使用方便字段可以通过三方软件进行查看.rar

    1. **Android 数据库**:Android系统使用SQLite作为其内置的轻量级关系型数据库,用于存储应用程序的数据。这里的数据库显然包含了联系人的详细信息,包括但不限于姓名、电话号码、归属地以及与银行相关的附加信息。...

    Android通讯录管理(获取联系人、通话记录、短信消息)

    1. **获取联系人信息**: Android提供了一套完整的API来访问和操作联系人数据。主要涉及`ContactsContract`类,它定义了一个内容提供者接口,允许应用读取和写入联系人信息。获取联系人通常分为以下步骤: - 请求...

    Eclipse下编译Android自带联系人应用

    在本文中,我们将深入探讨如何在Eclipse环境中编译Android操作系统自带的联系人应用。首先,我们需要理解Eclipse作为一个集成开发环境(IDE)在Android应用开发中的角色,以及如何利用其特性来处理Android源码。 **...

    安卓通讯录联系人打电话归属地相关-android手机号码归属地查询源码内附SQlite数据库并且有查询示例。.zip

    在Android平台上,开发一款应用程序来查询手机通讯录中的联系人号码归属地是一项常见的需求。这个压缩包提供的资源,包括源码、SQLite数据库以及相关的帮助文档,正是为了满足这样的需求。以下将详细介绍这些资源的...

    Android程序研发源码Android 联系人快速索引源码.zip

    这个"Android程序研发源码Android 联系人快速索引源码.zip"文件包含的是一个关于如何实现Android联系人应用快速索引功能的源代码示例。快速索引功能使得用户可以迅速定位到特定联系人,极大地提高了用户体验。下面...

    android-vcard-1.3.rar_VCardParser_V30_VCardSourceDetector_androi

    1. **数据获取**:使用VCardParser V30解析本地VCard数据,获取所有联系人的详细信息。 2. **数据过滤**:根据VCardSourceDetector的结果,筛选出需要同步的联系人。 3. **数据转换**:将Android的联系人对象模型...

    Android 2.1 从SD卡导入联系人 vcf

    这个过程包括读取.vcf文件、解析文件内容、创建或更新联系人条目,并最终将它们插入到联系人数据库中。 1. **读取SD卡文件**: Android提供`Environment.getExternalStorageDirectory()`方法获取SD卡的根目录,...

    android4.0联系人Contacts源代码

    《Android 4.0 联系人Contacts源代码解析》 在Android系统中,联系人管理是核心功能之一,其背后的实现机制涉及到许多关键知识点。本篇文章将深入探讨Android 4.0(Ice Cream Sandwich)中Contacts应用的源代码,...

Global site tag (gtag.js) - Google Analytics