Android联系人模块分析(一).doc_第1页
Android联系人模块分析(一).doc_第2页
Android联系人模块分析(一).doc_第3页
Android联系人模块分析(一).doc_第4页
Android联系人模块分析(一).doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android联系人模块分析(一)联系人模块是Android系统中的一个重要的功能模块,目前Android市场上有大量的基于通讯录的应用,本人计划写出系列文章详细介绍联系人模块的结构和使用。作为开头,本篇文章将对ContactsProvider做个简要的介绍。 Android系统将联系人的信息存储在sqlite数据库中,并通过ContactsProvider提供查询、更新、删除等操作。所以如果需要掌握联系人相关信息的操作,就需要掌握ContactsProvider的内容。 在开始学习ContactsProvider的内容之前,读者需要对ContentProvider机制有较深入的理 解,ContactsProvider本质上就是Android内建的一种ContentProvider。ContentProvider是 Android系统用来在所有应用程序之间共享数据的一种方法。下面我就从数据访问和存储的角度来介绍如何自定义一个ContentProvider,数 据存储在sqlite中: 1、提供外部访问的接口:访问接口是数据操作的前提,用户不需要知道内部数据的存储方式,只要通过数据访问接口就可以获取Provider中的数 据信息,以下为ContentProvider.java中定义的数据访问、操作的接口: javaview plaincopy1 public abstract Cursor query(Uri uri, String projection, 2 String selection, String selectionArgs, String sortOrder); 3 public abstract Uri insert(Uri uri, ContentValues values); 4 public abstract int update(Uri uri, ContentValues values, String selection, 5 String selectionArgs); 实现自定义ContentProvider,可以直接或间接的派生ContentProvider类,并override以上几种数据操作方法。 以ContactsProvider为例,在ContactsProvider2.java文件中,我们可以看到:javaview plaincopy6 public class ContactsProvider2 extends AbstractContactsProvider implements OnAccountsUpdateListener 7 public abstract class AbstractContactsProvider extends ContentProvider implements SQLiteTransactionListener ContactsProvider派生自AbstractContactsProvider,而AbstractContactsProvider又从ContentProvider派生,从AbstractContactsProvider.java中我们就可以看到 其override了一些数据操作方法。 2、创建数据库:通过派生SQLiteOpenHelper类,创建数据库及其各个表项信息; 在ContactsProvider中对应的即为ContactsDatabaseHelper类: javaview plaincopy8 public class ContactsDatabaseHelper extends SQLiteOpenHelper 为了让所有数据库访问者保持一致性,该类设计为单例类,该单例在ContactsProvider创建时创建: javaview plaincopy9 public boolean onCreate() 10 mDbHelper = new ContactsSearchDBHelper(getContext(); 11 return true; 12 通过该数据库帮助类,在访问数据库时,可以通过该帮助类获得数据库的读、写引用,如下面的insert操作: javaview plaincopy13 public Uri insert(Uri uri, ContentValues values) 14 SQLiteDatabase db = mDbHelper.getWritableDatabase(); 15 int match = sUriMatcher.match(uri); 16 long id = -1; 17 18 synchronized (mLock) 19 db.beginTransaction(); 20 try 21 switch (match) 22 /*case CONTACT_INFO: 23 id = db.insert(ContactInfo.TABLE_NAME, , values); 24 db.setTransactionSuccessful(); 25 break;*/ 26 case CircleMember_DATA: 27 id = db.insert(CircleMember.TABLE_NAME, , values); 28 db.setTransactionSuccessful(); 29 break; 3、定义数据表名、字段名,及其URI: 在ContactsProvider中,ContactsContract类定义了该provider的权限、数据表、URI信息:javaview plaincopy30 /* The authority for the contacts provider */ 31 public static final String AUTHORITY = com.android.contacts; 32 /* A content:/ style uri to the authority for the contacts provider */ 33 public static final Uri AUTHORITY_URI = Uri.parse(content:/ + AUTHORITY); Contacts数据表的定义:javaview plaincopy34 public static class Contacts implements BaseColumns, ContactsColumns, 35 ContactOptionsColumns, ContactNameColumns, ContactStatusColumns 36 /* 37 * This utility class cannot be instantiated 38 */ 39 private Contacts() 40 41 /* 42 * The content:/ style URI for this table 43 */ 44 public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, contacts); 上述只是简单的介绍了ContactsProvider的结构,下面我们来详细介绍一下ContactsProvider中的代码: 首先看看URI匹配表的生成逻辑: javaview plaincopy45 static 46 / Contacts URI matching table 47 final UriMatcher matcher = sUriMatcher; 48 matcher.addURI(ContactsContract.AUTHORITY, contacts, CONTACTS); 49 matcher.addURI(ContactsContract.AUTHORITY, contacts/#, CONTACTS_ID); 50 matcher.addURI(ContactsContract.AUTHORITY, contacts/#/data, CONTACTS_ID_DATA); 51 matcher.addURI(ContactsContract.AUTHORITY, contacts/#/entities, CONTACTS_ID_ENTITIES); 52 matcher.addURI(ContactsContract.AUTHORITY, contacts/#/suggestions, 53 AGGREGATION_SUGGESTIONS); 从URI匹配表的生成逻辑可以看出该Provider提供了哪些查询的方法,以这一行代码为例: matcher.addURI(ContactsContract.AUTHORITY, contacts/#/data, CONTACTS_ID_DATA); 这个URI就是对Contact表和Data表进行关联查询,当然这个查询是需要带上contactId的,目前ContactsProvider不支持其他字段的Contact表和Data表关联查询。用户就可以根据该URI来进行如下的查询操作:javaview plaincopy54 Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 55 String dataDir = ContactsContract.Contacts.Data.CONTENT_DIRECTORY; 56 Uri methodUri = Uri.withAppendedPath(contactUri, dataDir); 57 Cursor c = null; 58 try 59 c = mContext.getContentResolver().query(methodUri, 60 null, null, null, null); 61 catch (IllegalArgumentException e) 62 if (c != null) 63 c.close(); 64 65 上述查询代码就是通过contac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论