文章图片标题

Android通讯录联系人增删改查以及动态修改

分类:android开发 作者:阿流 评论:0 点击: 3,544 次 发布时间:2018-09-12

版权声明:本文为代码部落原创文章,转载请注明出处。

前言

前段时间阿流碰到了一个比较奇葩的需求,除了要求将姓名号码写入到通讯录之外,还必须可控写入的内容。也就是能支持每次访问协议时,如果该联系人的姓名,号码或者自定义标签字段发生改变,就必须及时作出修改。如下:

解决思路

刚看到这个需求时,我也有些疑惑。因为从该描述上来看,结合Android的特性,一个联系人的姓名跟号码均不是唯一的,无法作为身份标识。比如说我们这次从服务器或者一个叫【老王】【10086】的联系人,下次老王改名了,号码也换了,那我们如何找到原有通讯录的这个老王呢?因为我们通讯录里可能有多个叫老王的用户,也可能给10086这个手机号注册了两个主人,因此名字跟号码是不能作为身份的唯一标识。于是我们只能换一种思路来解决问题,我便是想到了能不能在通讯录的数据库里插入一条我们自定义的身份标识,同时又不影响显示。于是我将手机了的通讯录数据库导入出来。我们来看一下里面通讯录的结构。

数据库分析

以oppo R7 4.4操作系统为例:
数据库位置:

/data/data/com.Android.providers.contacts/databases.contacts2.db

需要注意的是,没有root的手机是拿不到这个数据库的。

  • contacts表
    该表保存了所有的手机联系人,每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。

  • raw_contacts表
    该表保存了所有创建过的手机测联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID:raw_contact_id和contact_id,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的raw_contact_id、contact_id、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

  • mimetypes表
    该表定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。

  • data表
    该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表保存了两个ID:mimetype_id和raw_contact_id,从而将data表和raw_contacts表联系起来。联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。如保存号码(mimetype_id=5)的那行数据中,data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。

以上就是与通讯录有关的数据库表,因为长度关系没有将所有字段截出来,具体的部分我下面会列出。有兴趣的可以自己从手机上导出来看一下。

权限申请

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

存储字段分析

根据我们的思路,我们应该是在手机通讯录里找到一个没用或者不常用的字段作为我们身份ID的存储字段。要怎么找到这个字段呢?我们先来动手测试一下。我们新建了一个联系人,并填写了一些拓展的信息。

然后我们观察一下上述几个表的数据的主要变化。

  • raw_contacts表

可以发现这个表增加了一个名叫【老王】的行,在这里并没有记录我们刚填写的拓展资料。

  • data表

可以发现我们刚添加的资料全部都跑到这里来了,并且每一项资料在这个表里都是独立占用一行,以mimetype_id区分。至于mimetype_id是什么含义,可以参考一下之前提到的mimetypes表。至于这两个表之前有什么联系,彼此之间是什么映射关系,让我们来仔细瞅一瞅。我们发现在data表里的raw_contact_id和raw_contacts表里的_id对应,那我们便知道了他们之间的映射关系。这里特别要指出的是,raw_contacts表里的contact_id看似与data表里的raw_contact_id对应,但我在实际操作中发现,在进行一系列增删查改之后,这两个字段会出现不一致的情况。所以说data表和raw_contacts的对应关系是,_id->raw_contact_id。
总结:我们发现data表里面的data6~data14没有被使用,经过查阅资料得知这些字段一般代表一些拓展信息,名字拼音,单位,住在,工作等等,并且跟手机的rom有关,我们在这里并不需要深究。

数据库操作

好了,终于来到最重要的环节,假设我们要往data表里的data9插入我们的自定义身份标识。我们可以这样做。

创建联系人:

查询联系人:

更新联系人:

删除联系人:

总结

以上就是我所完成这个奇葩需求的方案。在实际操作过程中,基本上还是应该在对数据库表某个字段操作之后,及时将数据库取出来,分析几个表之间的对应关系,这样子一方面可以加深我们对通讯录数据库的理解,另一方面也能更快的找出错误在哪里。我是在oppo R7手机上开发,之后在华为,小米以及酷派等手机上测试均没有问题。




声明: 本文由( 阿流 )原创编译,转载请保留链接: http://www.daimabuluo.com/blog/android/148.html

Android通讯录联系人增删改查以及动态修改:等您坐沙发呢!

发表评论