Android源码目录packages\providers下的应用是下载,通话等内置基本应用提供数据存储和操作的provider应用,本文章将针对ContactsProvider源码的架构和实现展开分析。(注:本文使用使用android4.0版本进行分析)
1、架构设计
ContactsProvider中数据操作基类是AbstractContactsProvider.java(参见frameworks\ex\common\java\com\android\common\content\SQLiteContentProvider.java),它继承ContentProvider.java实现SQLiteTransactionListener.java,类结构如下图所示:

图 1 provider
该类是抽象基类,在里面实现了父类的insert、delete和update三个抽象方法,在这三个方法中在其中使用了事务对进行操作。contactsprovider该类设计时,使用了模板模式模板方法为insertInTransaction,updateInTransaction和deleteInTransaction。该类在对进行事务操作的同时,对子类开放了onRollback,onCommit等事物回调方法,子类可以根据自己的业务特点进行扩展。增删改查的调用过程如下图2 3 4所示:

图2 插入操作

图 3 更新操作

图 4 删除操作
在整个设计中有两个类继承了AbstractContactsProvider.java,一个是ContactsProvider2.java,我们在调用系统的联系人数据时基本都是调用该类,里面封装了所有联系人的数据操作。第二个是ProfileProvider.java,该类是ContactsProvider2.java的委托类。contactsprovider这三个类的类间关系如下图5所示:

图 5 类间关系图
类ContactsTransaction.java是对事务的管理类,主要对进行的事务进行管理,类一个事务池。是AbstractContactsProvider.java中事务处理的核心类。
DataRowHandler.java是数据处理抽象类,实现了对数据的增删改操作,子类有如下几个:
DataRowHandlerForCommonDataKind.java DataRowHandlerForCustomMimetype.java DataRowHandlerForEmail.java DataRowHandlerForGroupMembership.java DataRowHandlerForIm.java DataRowHandlerForNickname.java DataRowHandlerForNote.java DataRowHandlerForOrganization.java DataRowHandlerForPhoneNumber.java DataRowHandlerForPhoto.java DataRowHandlerForStructuredName.java DataRowHandlerForStructuredPostal.java
这些子类在ContactsProvider2#initDataRowHandlers中初始化
private void initDataRowHandlers(Map<String, DataRowHandler> handlerMap,
ContactsDatabaseHelper dbHelper, ContactAggregator contactAggregator,
PhotoStore photoStore) {
Context context = getContext();
handlerMap.put(Email.CONTENT_ITEM_TYPE,
new DataRowHandlerForEmail(context, dbHelper, contactAggregator));
handlerMap.put(Im.CONTENT_ITEM_TYPE,
new DataRowHandlerForIm(context, dbHelper, contactAggregator));
handlerMap.put(Organization.CONTENT_ITEM_TYPE,
new DataRowHandlerForOrganization(context, dbHelper, contactAggregator));
handlerMap.put(Phone.CONTENT_ITEM_TYPE,
new DataRowHandlerForPhoneNumber(context, dbHelper, contactAggregator));
handlerMap.put(Nickname.CONTENT_ITEM_TYPE,
new DataRowHandlerForNickname(context, dbHelper, contactAggregator));
handlerMap.put(StructuredName.CONTENT_ITEM_TYPE,
new DataRowHandlerForStructuredName(context, dbHelper, contactAggregator,
mNameSplitter, mNameLookupBuilder));
handlerMap.put(StructuredPostal.CONTENT_ITEM_TYPE,
new DataRowHandlerForStructuredPostal(context, dbHelper, contactAggregator,
mPostalSplitter));
handlerMap.put(GroupMembership.CONTENT_ITEM_TYPE,
new DataRowHandlerForGroupMembership(context, dbHelper, contactAggregator,
mGroupIdCache));
handlerMap.put(Photo.CONTENT_ITEM_TYPE,
new DataRowHandlerForPhoto(context, dbHelper, contactAggregator, photoStore));
handlerMap.put(Note.CONTENT_ITEM_TYPE,
new DataRowHandlerForNote(context, dbHelper, contactAggregator));
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-36537-1.html
信不信由你
>大家不要迷信美国所谓最新的濒海战斗舰