Android Contact分析(一):Data, RawContact, Contact之间的关系

时间:2024-03-10 18:57:50

一、前言:

        最近任务暂时做完了,有一,两天空闲时间,因此,就想把Android Contact这块梳理下,也方便以后自己。

        Android Contact的所有数据库表,都存在contacts2.db(路径: /data/data/com.android.providers.contacts/databases/contacts2.db)中,之所以叫contact2,是因为,它是从Android 2.0(API Level5)开始,对这块的API有了改进,以适应一个联系人有多个帐户的需求(如手机通讯录与GMAIL通讯录),联系人数据库是基于关系型的,它们之间的关系如下:

二、表Data

        Data表存储了联系人的详细信息,表中的每一行存储一个特定类型的信息,比如Email、Address或Phone等,每一行通过一个mimetype_id的字段来表示该行存储的是什么类型的数据,该字段引用了mimetyps表,此表存储了常用的数据类型。

表Data的数据字段:

各字段讲解:

mimetype_id
表示该行存储的信息的类型

raw_contact_id
表示该行所属的RawContact

is_primary
该字段表示此data是否是其所属的raw contact的主data,即其display name会作为raw contact的display name

is_super_primary
该data是否是其所属的contact的主data,如果is_super_primary为1则is_primary一定为1

data1 - data15
数据字段,由mimetype_id来决定,一般data1表是主信息(如电话,Email地址等),data2表示副信息,data15表示Blob数据(binary data),如:
类型是Phone.CONTENT_ITEM_TYPE,则data1存的就是phone number;
类型是 Email.CONTENT_ITEM_TYPE,则data1存的就是email address等。

data_sync1~data_sync4
sync_adapter要用的字段,sync_adapter用于数据的同步,比如你手机中的Gmail帐户与Google服务器的同步。

data_version
数据的版本,用于数据的同步。

三、表RawContact

        RawContact表每行为每个用户存储了联系信息,当插入一个raw contact或当一个raw contact所属的一个data改变时,系统会检查这个raw contact跟其他的raw contact是否可以匹配(比如,如果两个raw contact的data包含相同的电话号码或名字),如果匹配他们就会被综合到一起,也就是说他们会属于同一个cantact,表现为在RawContact表中他们引用的cantact_id是一样的。

表RawContact数据字段

四、表Contact

        Contact表不能被主动创建,Contact表中的一行表示一个联系人,它是RawContact表中的一行或多行的数据的组合,这些RawContact表中的行表示同一个人的不同的帐户信息。Contact中的数据由系统组合RawContact表中的数据自动生成,不可以直接向这个表中插入数据,当一个raw contact被插入的时候,系统会首先查找Contact表看是否有记录跟插入的raw contact表示同一个人,如果找到了,则把找到的这个contact的_ID插入raw contact记录的CONTACT_ID字段,如果没有找到,则系统自动插入一个Contact记录并把它的_ID插入新插入的raw contact的CONTACT_ID列。

更新操作:

Contact表中只有TIMES_CONTACTED、LAST_TIME_CONTACTED、STARRED、CUSTOM_RINGTONE、SENE_TO_VOICEMAIL列可更改,这些列的更改会导致相应的raw contact被更改。

删除操作:

当删除Contact表中的记录时,会删除一个联系人的所有帐户的信息,也就是说,其对应的所有raw contacts也会被删除,各raw contact对应的data也就被删除了,sync adapter同步时也会删除服务器端的相应记录。

查询操作:

如果需要查找一个联系人的信息用CONTENT_LOOKUP_URI代替CONTENT_URI(见后面);
如果需要通过电话号码查找一个联系人,用PhoneLookup.CONTENT_FIILTER_URI,这个URI为这个目的进行了优化;
如果需要通过部分名字的匹配查找,用CONTENT_FILTER_URI;
如果需要通过email,address等信息查找,查找表ContactsContract.Data,结果包含contact ID,名字等。

五、小结

这篇文章只是讲了这三张表之间的关系,以及各自的字段,是一些原理性的东西,除了这三张表,在实际操作中,还涉及到其它类的参与,比如ContactsContract.Data, ContactsContract.CommonDataKinds, ContactsContract.PhoneLookup等,下篇文章,将会给出一些例子,来对原理有更深的了解。