日期:2014-05-16  浏览次数:20490 次

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_I