android 1.6 联系人数据的研究

来源:互联网 发布:yy主播好听网络歌曲 编辑:程序博客网 时间:2024/05/22 03:27

一、简介

      android操作系统中,联系人信息是我们经常要获取的。作为嵌入式操作系统,无外乎几个主要功能:电话、短信、上网等。联系人信息是我们用的比较多的。但是,要获取联系人信息,我们会遇到一些概念和相关的类(content provider, URI等),它们之间是错综复杂的,不易理解。为了方便我们对联系人信息的获取,我们必须找到一种方法,能快速的掌握其中的关系,这就是本文的出发点。

      对联系人数据库的操作实际上就是:通过Android封装的接口,对联系人数据库进行的操作,这些操作包括:读取、更新、删除等。本文主要围绕这一点展开,分析联系人数据库和android相关接口之间的关系,以利于我们利用android接口获取想要的联系人信息。

      本文分析所采用的android操作系统版本为1.6。

二、数据库分析

      要了解联系人数据库相关的操作,就必须了解联系人的数据库表的结构,android 1.6中,联系人的数据库位于一下目录中。

/data/data/com.android.providers.contacts/databases/contacts.db

       contacts.db是sqlite数据库文件,使用sqlite管理软件便可打开。该数据库文件中包含了几个和联系人相关的表:contact_methods,groups,groupmembership,people,phones等。看名称我们大概就知道它们用来保存什么数据,这里要注意的是表contact_methods用来存储联系人的地址、Email和IM号码。下面就简单的分析一下和联系人关系紧密的几个表。

      2.1 people

      contacts表保存了联系人的相关基本信息,具体定义参见下图:

NT@{YD~1Y(A{Y]G{[EKB{4F

      简单的介绍主要的几个字段,参见如下说明,没提到的字段可按名称猜测其用途。
      _id: 用于标识联系人
      name: 联系人的名字
      notes: 备注
      primary_phone: 首要的手机号码
      primary_organization: 首要的组织
      primary_email: 首要的email地址

      2.2 contact_methods
      该表主要保存了联系人的电话号码、email地址和地址,具体参见如下定义:

1FM[}CT[)4@COZ9M{HHO8NH

      主要字段的描述如下:
      _id: 标识
      person: 每条记录(数据的一行)所属的联系人id号。
      kind: 这个字段用来区分记录是电话号码、email地址,还是地址
      data: 用来保存实际的电话号码、email地址或地址的值
      type: 指定了电话号码、email地址或地址的类型,比如:email是工作、家庭,还是自定义等
      label: 貌似是用来自定义数据的字类型名称,这个需要测试才知道确切含义。
      isprimary: 是否是首选

      从该表的定义可以看出,用户可以自定义其它类型的数据添加在此表中,以扩充联系人的属性。

      2.3 group, groupmembership
      表group保存了所有的联系人分组,而groupmembership则保存了联系人和分组的关联,通过表groupmembership可以知道那个联系人在那个分组。因为比较简单此处就不详细描述。

      2.4 其它
      其它的表,如若用到,按名称则可以猜测大概用途,此文也不作详细介绍。而且,在android上,一般情况下,我们并不需要直接操作数据库文件,因此,对于表及具体的信息并不需要了解的太详细,知道大概就能应对一般的需求。

三、操作联系人数据

      在android上,要操作contacts.db,不需要使用select语句操作。android对select语句进行了封装,具体的是通过ContentSolver类来封装的,这个在android文档里有介绍,此处就不多说。

      为了能让应用操作某一个特定的表,android提供以content://开头的Uri,用来唯一标识数据库中的表,联系人相关的表也不例外,比如,表people的Uri为:

content://contacts/people

      这种格式有点类似于网址,contacts标识了和联系人相关的表,people是上面提到的表people。再比如,email的Uri为:

content://contacts/contact_methods/email

      contact_methods为上面提到的表contact_methods,而email代表了表contact_methods中的kind值,也就是说为了获取email方便,为email也设立了逻辑上独立的Uri。

      实际上,和联系人相关的表的Uri,android已经作了很好的封装,相关的类位于android.provider.Contacts下。类ContactMethods对应表contact_methods,People对应表people,其它以此类推。每个和表相关的类中定义了常量CONTENT_URI,用来标识表;以及_ID等字符串常量用来表示表列的属性值,这些封装都是和实际的数据库表一一对应的。

      通过android.provider中的类,我们可以知道联系人中有哪些表,以及表的结构是怎么样的。剩下来的工作就是操作这些表了,和表相关的操作被封装在ContentResolver中,可以通过Activity的getContentResolver()方法获取,你可以new一个新的Activity,也可以使用自己的Activity。主要有三个接口:query,insert,delete。它只是封装了SQL语句,但仅仅是SQL语句的一个子集,这也就意味着这些接口有可能无法替代直接的SQL。

四、总结

      android联系人的核心在于联系人的db文件的定义,其它的概念都是围绕这个文件来展开的。如果你能理清这个db文件中的表的关系,你甚至直接可以操作这些表(911助手就是这么做的),希望本文能让你想起点什么

原创粉丝点击