理清contactsprovider

初步了解android contact provider
  
        android的联系人数据单独拿出来做成ContactsProvider,众多的table和view整体看下来,使得联系人的数据错综复杂。但是我们在开发的过程并不需要将所有的table都搞清楚。用到最多的是 ContactsContract.Contacts、ContactsContract.RawContacts、ContactsContract.Data这三张表格。

        先预览一下,一个联系人数据的存储结构:
可以很直观的看出。一个联系人在contacts2.db中(除了profile.db中的自己外),数据基本存放在3张表中,在ContactsContract.Contacts中会存在一条记录,在ContactsContract.RawContacts中可能存在多个记录,ContactsContract.Data中的数据是对ContactsContract.RawContacts的详细描述。
       
                     
                           (图1)
        ContactsContract.Contacts的表格大致如下,_id对应着的就是我们在contacts中看到的一个联系人。有一点需要注意的是,当删除掉一个联系人时,表中的记录会删除,但是_id并不会减少,而是一直增加,所以有可能看到的_id是1,2,4...这样的记录。

_id

starred

lookup

photo_id

1

0

 ...

<null>

2

0

 ...

<null>

4

1

 ...

1

       
        ContactsContract.RawContacts的表格结构大致如下,它里面的记录主要是针对特定账户下的联系人数据的描述(data表中的数据)。这边的contact_id对应的是contacts表中的_id,一个联系人在raw_contacts表格中可能存在一条以上的记录,这主要是由于caccount_name和account_type不同造成的。
        这边需要用一个例子来帮助理解:
假设我在我的手机上有三个账户 gaojian@gmail.com、gaojian3301@gmail.com,这两个账户的“同步联系人”都被check上,当我添加一个联系人到手机里时,这个联系人会同时被备份到这个两个账户中去,所以这两个记录在raw_contacts表格中的contact_id会一样。

_id

contact_id

account_name

account_type

deleted

1

1

gaojian@gmail.com

com.google

1

2

1

gaojian1305039@163.com

163.com

 0


        data表格中记录的数据是对raw_contacts中数据的详细描述。这边的data1存储的值就是联系人在搜索时会search的值;data15用来存储一些比较大的二进制对象,比如说联系人的头像缩略图。
这一边需要注意一个事情:在我们开发或者测试的过程中,不要将与MMIETYPE格式不匹配的数据存入data中(比如将email的值设置为1233445),这可能会造成data数据的丢失,更甚者会导致provider出问题(这个我猜测比如在发送Email的时候,去选择contacts,返回值可能会有问题,没有验证过)。

_id

raw_contact_id

mimetype_id

data1

data2

data15

1

1

6



<null>

2

1

5

110

1

<null>

3

3

6

gaojian

gao

<null>


        总结一下,我们可以从contacts中找到我们想要看的联系人,在raw_contacts中可以看到的是这个联系人一些数据的基本描述,而data提供给我们的是这个联系人所有的具体信息。这三张表格就是在平时开发中,打交道最多的表格。当然,如果要获取和修改群组的信息,那么还会接触到group这张表格;而筛选的表格对应的是search_index。
      
      放一张android官方api的图做个了断:
                                             


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值