,短信息等,都存储在SQLite数据库中。
通信热点
图4联系人同步分层模型4.3.1同步分层模型系统采用分层设计,层与层直接没有关联,通过每个层提供的接口传输数据信息,以保持模块直接的高内聚和低耦合。如图4所示,分为以下几个模块:(1)同步引擎层:实现数据同步过程中数据同步策略的具体实现,用户可以根据实际的情况对同步引擎进行调整和扩展;本层包括了两个部分:客户端发送SyncML消息构建和接收到应答消息处理。(2)同步数据源:实现对同步数据源的实际操作,以及提供同步客户端和同步服务器之间的交互接口。(3)传输层:传输层主要责任是传输SyncML数据包。由于本模块可以由一系列模块组成,所以采用了工厂模式的设计方式,用以解决采用不同的传输协议时数据处理。本同步系统中采用的是HTTP1.1协议。[3](4)SyncML模块:客户端鉴权加密算法,如MD5,Base64等,以及鉴权算法的编解码和解码[1]。(5)协议层模块:SyncML协议栈,包含了SyncML
联系人数据库在Android平台中存储的绝对路径为/data/data/com.android.providers.contact/databases中。
4.2vCard电子商务卡片
vCard也称为电子商务卡片(ElectronicBusinessCard),主要用于记录通讯录中联系人信息等,它实现不同厂商提供的PDA,手机,PC等设备之间的名片互通。vCard标准定义了名片在传递时通信的双方都必须遵循的格式标准,这种格式适合作为各种应用之间交换的格式,并且与传送的方法和方式无关。每个vCard对象由行BEGIN:VCARD开始,最后以END:VCARD结束,中间可以有任意多个vCard字段行。每一字段行包括三个部分:字段名(PropertyName),字段参数(PropertyParam),字段值(PropertyValue),并且后面都有“\r\n”回车换行。格式如下[4]:PropertyName[':'PropertyParam]':'PropertyValue
4.3联系人数据同步
本同步系统采用Funambol开源项目提供的同步服务器,客户端软件开发的时候也使用了其提供的底层开发包。
同步协议的具体实现。(6)联系人同步层:从移动设备中的联系人数据库中读写包括增加,删除,更新的联系人信息,使之与服务器端的数据库保持同步。此外,还需要维护本地数据信息
16
Android移动终端数据同步技术研究与应用
的变改数据库,以及按照vCard2.0协议对联系人数据信息进行封装和解析。(7)用户界面:主要负责和用户之间的交互,例如获得配置信息,以及提示给用户同步的进度[6]。4.3.2核心代码
设计(1)联系人数据项(Contact类)的设计Contact类设计有两个个构造函数,主要作用是为了在不同的情况下时用于构造Contact对象。以下是Contact类的两个构造函数:如果是处理从服务器发回客户端的同步数据项中vCard的解析,调用构造函数1;如果是处理从客户端发给服务器端的数据同步项中vCard的封装,调用构造函数2。①publicContact(Stringvcard){parseVCard(vcard);}②publicContact(CursorpeopleCur,ContentResolvercResolver){populate(peopleCur,cResolver);}本同步系统中联系人数据项的vCard格式如下:
BEGIN:VCARDVERSION:2.1N:EMAIL;INTERNET:EMAIL;INTERNET;WORK:TEL;VOICE;HOME:TEL;VOICE;WORK:TEL;CELL:ORG:TITLE:NOTE:
END:VCARD以上每行的字段分别表示的是:vCard版本,姓名,Email地址,工作Email地址,住宅电话,工作电话,移动电话,公司,联系人标题,备注,分别对应了Contact类中定义的成员变量。(2)同步联系人数据项在双向快同步中,需要查找自上次同步后修改的联系人数据项,因此,我们首先要判断那些数据项自上次同步以后作了修改操作,这就要求我们的移动终端要能够检测出这些变更数据项。实现的方式是首先将联系人的数据写入一个临时数据库,同步时,通过比较联系人数据库中的ID项与临时数据库中的ID值就可以查询出联系人数据项是否进行了修改,以及进行了何种类型的修改。特别指出的是为了方便管理联系人同步项,在设计这个临时数据库时,采用了哈希表的映射机制,利用HashTable的键值对
热点信通
应的方式来标识每一个同步数据项,且在这个哈希表中存储的是客户端联系人数据项的变更信息,实现这一功能的伪代码[6]如下:/*定义哈希映射表*/privateHashtableitemContentTable;/*查询临时数据库*/CursorpItems=ContacatDatabase.
rawQuery("SELECT*FRO