手机访问 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 编程 > 移动开发 >

Android Contact provider基础

2016-08-02 15:38|来源:未知 |作者:dnzg |点击:

Contact provider是一个强大而又灵活的 Android 组件,用于管理设备上有关联系人数据的中央存储库。 Contact provider是您在设备的联系人应用中看到的数据源,您也可以在自己的应用中访问其数据,并可在设备与在线服务之间传送数据。 提供程序储存有多种数据源,由于它会试图为每个联系人管理尽可能多的数据,因此造成其组织结构非常复杂。 为此,该提供程序的 API 包含丰富的协定类和接口,为数据检索和修改提供便利。

本指南介绍下列内容:

提供程序基本结构 如何从提供程序检索数据 如何修改提供程序中的数据 如何编写用于同步服务器数据与联系人提供程序数据的同步适配器。

Contact provider(联系人提供程序组织)


联系人提供程序是 Android 内容提供程序的一个组件。它保留了三种类型的联系人数据,每一种数据都对应提供程序提供的一个表,如图 1 所示:
加载中...
图 1. 联系人提供程序表结构。

这三个表通常以其协定类的名称命名。这些类定义表所使用的内容 URI、列名称及列值相应的常量:

ContactsContract.Contacts表
表示不同联系人的行,基于聚合的原始联系人行。

ContactsContract.RawContacts 表
包含联系人数据摘要的行,针对特定用户帐户和类型。

ContactsContract.Data 表
包含原始联系人详细信息(例如电子邮件地址或电话号码)的行。

由 ContactsContract中的协定类表示的其他表是辅助表,Contact provider利用它们来管理其操作,或为设备的联系人或电话应用中的特定功能提供支持。

Original Contacts(原始联系人)


一个原始联系人表示来自某一帐户类型和帐户名称、有关某个联系人的数据。 由于Contact provider允许将多个在线服务作为某一联系人的数据源,因此它允许同一联系人对应多个原始联系人。 借助支持多个原始联系人的特性,用户还可以将某一联系人在帐户类型相同的多个帐户中的数据进行合并。

原始联系人的大部分数据并不存储在 ContactsContract.RawContacts 表内,而是存储在 ContactsContract.Data 表中的一行或多行内。每个数据行都有一个 Data.RAW_CONTACT_ID 列,其中包含其父级 ContactsContract.RawContacts 行的 android.provider.BaseColumns#_ID RawContacts._ID 值。

重要的原始联系人列
表 1 列出了 ContactsContract.RawContacts 表中的重要列。 请阅读表后的说明:

表 1. 重要的原始联系人列。

列名称 用途 备注
ACCOUNT_NAME 作为该原始联系人来源的帐户类型的帐户名称。 例如,Google 帐户的帐户名称是设备所有者的某个 Gmail 地址 此名称的格式专用于其帐户类型。它不一定是电子邮件地址。
ACCOUNT_TYPE 作为该原始联系人来源的帐户类型。例如,Google 帐户的帐户类型是 com.google。 请务必使用您拥有或控制的域的域标识符限定您的帐户类型。 这可以确保您的帐户类型具有唯一性。 提供联系人数据的帐户类型通常关联有同步适配器,用于与Contact provider进行同步。
DELETED 提供联系人数据的帐户类型通常关联有同步适配器,用于与Contact provider进行同步。 此标志让Contact provider能够在内部保留该行,直至同步适配器能够从服务器删除该行,然后再从存储库中最终删除该行。

说明
以下是关于 ContactsContract.RawContacts 表的重要说明:

原始联系人的姓名并不存储其在 ContactsContract.RawContacts 中的行内,而是存储在 ContactsContract.Data 表的 ContactsContract.CommonDataKinds.StructuredName 行内。一个原始联系人在 ContactsContract.Data 表中只有一个该类型的行。 注意:要想在原始联系人行中使用您自己的帐户数据,必须先在 AccountManager 中注册帐户。 为此,请提示用户将帐户类型及其帐户名称添加到帐户列表。 如果您不这样做,联系人提供程序将自动删除您的原始联系人行。

例如,如果您想让您的应用为您域名为 com.example.dataservice、基于 Web 的服务保留联系人数据,并且您的服务的用户帐户是 becky.sharp@dataservice.example.com,则用户必须先添加帐户“类型”(com.example.dataservice) 和帐户“名称”(becky.smart@dataservice.example.com),然后您的应用才能添加原始联系人行。 您可以在文档中向用户解释这项要求,也可以提示用户添加类型和名称,或者同时采用这两种措施。

Original contact data sources(原始联系人数据来源)

为理解原始联系人的工作方式,假设有一位用户“Emily Dickinson”,她的设备上定义了以下三个用户帐户:

emily.dickinson@gmail.com emilyd@gmail.com Twitter 帐户“belle_of_amherst”

该用户已在 Accounts 设置中为全部三个帐户启用了 Sync Contacts。

假定 Emily Dickinson 打开一个浏览器窗口,以 emily.dickinson@gmail.com 身份登录 Gmail,然后打开 “联系人”,并添加“Thomas Higginson”。后来,她以 emilyd@gmail.com 身份登录 Gmail,并向“Thomas Higginson”发送一封电子邮件,此操作会自动将他添加为联系人。 她还在 Twitter 上关注了“colonel_tom”(Thomas Higginson 的 Twitter ID)。

以上操作的结果是,联系人提供程序会创建以下这三个原始联系人:

第一个原始联系人对应“Thomas Higginson”,关联帐户 emily.dickinson@gmail.com。 用户帐户类型是 Google。 第二个原始联系人对应“Thomas Higginson”,关联帐户 emilyd@gmail.com。 用户帐户类型也是 Google。由于添加的联系人对应的用户帐户不同,因此尽管名称与前一名称完全相同,也只能作为第二个原始联系人。 第三个原始联系人对应“Thomas Higginson”,关联帐户“belle_of_amherst”。用户帐户类型是 Twitter。

Data(数据)


如前文所做的说明,原始联系人的数据存储在一个 ContactsContract.Data 行中,该行链接到原始联系人的 _ID 值。这使一位原始联系人可以拥有多个具有相同数据类型的实例,例如电子邮件地址或电话号码。 例如,如果对应 emilyd@gmail.com 的“Thomas Higginson”(关联 Google 帐户 emilyd@gmail.com 的 Thomas Higginson 的原始联系人行)的住宅电子邮件地址为 thigg@gmail.com,办公电子邮件地址为 thomas.higginson@gmail.com,则联系人提供程序会存储这两个电子邮件地址行,并将它们都链接到原始联系人。

请注意,这个表中存储了不同类型的数据。显示姓名、电话号码、电子邮件、邮政地址、照片以及网站明细行都可以在 ContactsContract.Data 表中找到。 为便于管理这些数据, ContactsContract.Data 表为一些列使用了描述性名称,为其他列使用了通用名称。 使用描述性名称的列的内容具有相同的含义,与行中数据的类型无关,而使用通用名称的列的内容则会随数据类型的不同而具有不同的含义。

(责任编辑:dnzg)
图片推荐
    友荐云推荐
网友评论