天天看点

[android研究联系人之一]联系人IM/website数据操作

最近要忙于工作了,工作中的事情有点多,也没时间做ui了。不过,等过一点时间充裕。会继续推出新的学ui博客。感谢大家的关注!!!

这篇博客,主要是要介绍android联系人数据操作,讲解一些工作中遇到的一些新情况。分享给大家!

从android2.2以后,android又经过几个版本的更新,联系人这块的操作已经发生了很大的变化。这次先讲解今天遇到两个数据操作问题:

一、联系人中im数据怎样更新?

       先看im有哪些数据,看图:

[android研究联系人之一]联系人IM/website数据操作

总共类型,大概有10种,包括用户可以自定义类型。

先介绍主要的im类中的主要的字段:

统一的查询uri:contactscontract.data.content_uri

所有的数据存放,基本上都在contactscontract .data类中,如想取数据:

private static final string[] projection = new string[] {

                data.contact_id,

                data.data1, data.data2,

                data.data3, data.data4,

                data.data5, data.data6,

                data.data7, data.data8,

                data.data9, data.data10,

                data.mimetype

        };

查询的条件必须加上类型,如:contactscontract.commondatakinds.im.content_item_type

如果是查询im数据,则需要关心,以下几个字段:

       data.raw_contact_id表示联系人的id

     data.mimetype:表示mime类型,查im则类型为:im.content_item_type

       data.data1:表示用户填写的数据,如:是qq类型,则此为qq号:123456789

       data.data2:表示数据类型,个人感觉是源码中对应的此类型:(目前手机中读取出来的值都为3)

                                    public static final int type_home = 1;

                                    public static final int type_work = 2;

                                    public static final int type_other = 3;

           也看图,有图有真相:

          添加数据图:

[android研究联系人之一]联系人IM/website数据操作

          两条基本数据,一条自定义数据。

        看看数据库中的结果图:

[android研究联系人之一]联系人IM/website数据操作

data2就是type,是不是都是3啊(用手机测试,也是这个值)。

data.data5:在源码中是im.protocol:它才表示的是真正的类型,如源码中对应的类型:

                                  public static final int protocol_custom = -1;

                                  public static final int protocol_aim = 0;

                                  public static final int protocol_msn = 1;

                                  public static final int protocol_yahoo = 2;

                                  public static final int protocol_skype = 3;

                                  public static final int protocol_qq = 4;

                                  public static final int protocol_google_talk = 5;

                                 public static final int protocol_icq = 6;

                                 public static final int protocol_jabber = 7;

                                  public static final int protocol_netmeeting = 8;

而当protocol的取值为-1时,则要取出data.data6的值。

data.data6 :在源码中是im.custom_protocol字段,它表示是用户自定义的值,

                                              也就是只有data5为-1时,这个取取出来才不是null(上图能很好的证明了)

基本上只要了解这几个字段,就能正确的完成im数据的操作。

二、怎样更新website数据?

下面,再介绍一个很是纠结的数据:website

website在手机中,是可以插入多条数据,但在操作的数据库,是不能区分多条数据(不知道为啥)。

做项目,当然不能凭感觉说话,要找到证据才能说明问题,这时候,当然去看数据库,有图有真相:

[android研究联系人之一]联系人IM/website数据操作

这是我编辑的两条数据,也没有类型选择。所以,用类型区分是不可能的。此点已证明。

接下来看数据库中保存的内容,看看最终保存的结果,就知道结果:

[android研究联系人之一]联系人IM/website数据操作

从上面的数据,可以看出来保存的数据,也没有字段区分这两条数据。所以,再一次证明,推论正确。

这是website的问题,但下面看一下website需要操作的字段:

   data.mimetype:表示mime类型,查website类型为:website.content_item_type

   website.type:表示类型,对应的类型如下:(但手机中都对应的是7,感觉基本无用)

                            public static final int type_homepage = 1;

                            public static final int type_blog = 2;

                            public static final int type_profile = 3;

                            public static final int type_home = 4;

                            public static final int type_work = 5;

                            public static final int type_ftp = 6;

                            public static final int type_other = 7;

    website.url:对应data.data1数据:表示用户输入的数据,如:www.csdn.com

   website.label:暂时无用了。

  website操作结论:要想实现更新,就只能先删除,再重新插入。

这两个类型数据,比较简单,只要知道操作哪些数据了,基本就没什么问题了。

操作的代码不在电脑上,所以,就不上传了。如果大家对此有任何疑问,欢迎一起讨论!!!

后续,还会再研究联系人中的其它字段。欢迎大家关注了,如发现有错误的地方,欢迎指正!!!

修正:

website数据,它的源码:

这个类中的主要数据只有这些,其实看到它定义了类型,就知道,它应该也可以添加为多条。

在以前的分析中,由于只是在模拟器中分析,发现它不能添加多条,所以,就有一个错误的地方。

现在在moto里程碑二中,是有多条数据的。所以,它的type和label也是有用的。

在此说明一下。

补充:im说明

文章前面讲述了从源码中的一些字段说明,这里要再提一下的是,对于相同类型的数据,在data表中只能通过_id

来标识,除此之外,想要通过其它字段做更新,是不可行的。

如下图,添加的两条数据:

[android研究联系人之一]联系人IM/website数据操作

被红线圈的数据,就是类型一样的数据。除了 id是无法区分的。

后面要纠正上文对im解释中的一些问题:

这是im字段的源码。其实它有type字段,在数据表中是data.data2表示。

当type为custom(为0)的时候,这时就是自定义的数据类型。这个时候

自定义的名称为label,存在data.data3字段中。

而这里需要说明的一点是,im是有一个protocol字段,用data.data5存储。

它表示是哪种协议的im,如qq、skype等。

如果是自定义类型的,则在custom_protocol,也就是data.data6字段中,存有一份和data3一样的数据。

所以,对im操作,首先要注意:data2的数据类型。若为自定义的,就要取label值。

                             接着要注意:data5的值,它能判断出来是哪种im.

这些说明,希望能帮助大家更好的理解数据库表,如有问题,欢迎交流!!!