2024年4月15日发(作者:)

Android联系人模块分析(一)

联系人模块是Android系统中的一个重要的功能模块,目前Android市场上有大量的基于通

讯录的应用,本人计划写出系列文章详细介绍联系人模块的结构和使用。作为开头,本篇文

章将对ContactsProvider做个简要的介绍。

Android系统将联系人的信息存储在sqlite数据库中,并通过ContactsProvider提

供查询、更新、删除等操作。所以如果需要掌握联系人相关信息的操作,就需要掌握

ContactsProvider的内容。

在开始学习ContactsProvider的内容之前,读者需要对ContentProvider机制有较

深入的理 解,ContactsProvider本质上就是Android内建的一种ContentProvider。

ContentProvider是 Android系统用来在所有应用程序之间共享数据的一种方法。下面我就

从数据访问和存储的角度来介绍如何自定义一个ContentProvider,数 据存储在sqlite中:

1、提供外部访问的接口:访问接口是数据操作的前提,用户不需要知道内部数据的

存储方式,只要通过数据访问接口就可以获取Provider中的数 据信息,以下为

中定义的数据访问、操作的接口:

[java]view plaincopy

 public abstract Cursor query(Uri uri, String[] projection,

 String selection, String[] selectionArgs, String

sortOrder);

 public abstract Uri insert(Uri uri, ContentValues values);

 public abstract int update(Uri uri, ContentValues values,

String selection,

 String[] selectionArgs);

实现自定义ContentProvider,可以直接或间接的派生ContentProvider类,并override

以上几种数据操作方法。

以ContactsProvider为例,在文件中,

我们可以看到:

[java]view plaincopy

 public class ContactsProvider2 extends AbstractContactsProvider

implements OnAccountsUpdateListener

 public abstract class AbstractContactsProvider

ContentProvider implements SQLiteTransactionListener

extends

ContactsProvider派生自AbstractContactsProvider,而

AbstractContactsProvider又从ContentProvider派生,从

中我们就可以看到 其override了一些

数据操作方法。

2、创建数据库:通过派生SQLiteOpenHelper类,创建数据库及其各个表项信息;

在ContactsProvider中对应的即为ContactsDatabaseHelper类:

[java]view plaincopy

 public class ContactsDatabaseHelper extends SQLiteOpenHelper

为了让所有数据库访问者保持一致性,该类设计为单例类,该单例

在ContactsProvider创建时创建:

[java]view plaincopy

 public boolean onCreate() {

 mDbHelper = new ContactsSearchDBHelper(getContext());

 return true;

 }

通过该数据库帮助类,在访问数据库时,可以通过该帮助类获得数据库的读、写引用,

如下面的insert操作:

[java]view plaincopy

 public Uri insert(Uri uri, ContentValues values) {

 SQLiteDatabase db

tableDatabase();

 int match = (uri);

 long id = -1;



 synchronized (mLock) {

 ransaction();

 try {

 switch (match) {

=