技术:Android联系人数据库分析
知识点:分析联系人中Phone和Organization数据。
重点:数据类型
联系人数据库中,最重要的当然是手机号字段。接下来仔细分析该字段了。
先看Android提供了多少种类型:下面是从模拟器中截的类型图:
看到这么多截图,就知道一个手机字段的类型有多少了吧。总共21种类型(实际真实的手机中,当然不会有这么全)。
来看系统源码中对类型的定义:
public static final int TYPE_HOME = 1; public static final int TYPE_MOBILE = 2; public static final int TYPE_WORK = 3; public static final int TYPE_FAX_WORK = 4; public static final int TYPE_FAX_HOME = 5; public static final int TYPE_PAGER = 6; public static final int TYPE_OTHER = 7; public static final int TYPE_CALLBACK = 8; public static final int TYPE_CAR = 9; public static final int TYPE_COMPANY_MAIN = 10; public static final int TYPE_ISDN = 11; public static final int TYPE_MAIN = 12; public static final int TYPE_OTHER_FAX = 13; public static final int TYPE_RADIO = 14; public static final int TYPE_TELEX = 15; public static final int TYPE_TTY_TDD = 16; public static final int TYPE_WORK_MOBILE = 17; public static final int TYPE_WORK_PAGER = 18; public static final int TYPE_ASSISTANT = 19; public static final int TYPE_MMS = 20;
这怎么可能 ,当然不会少了,还有一个数据就是类型为0的自定义的数据。
接下来,分析Phone中,最重要的几个字段数据:
类型:ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
Phone.NUMBER:对应Data.data1:表示手机数据,如:13810000000
Phone.TYPE:对应Data.data2:表示手机类型。注意:为0时,为自定义类型。
Phone.LABEL:对应Data.data3:表示自定义类型的名称(只有type为0时,才有此值)。
分析起来,还是比较简单。基本没有太在的难度。
接下来分析Organization字段:
先也看看系统提供了多少种类型:
看图:
类型只有这三种。
看看源码对类型的定义:
public static final int TYPE_WORK = 1; public static final int TYPE_OTHER = 2;
接着看模拟器中的Organization数据操作:
看图:
难道中有这两个字段?
当然不是,不知模拟器中会这么简单。
还是看源码中,定义了哪些可操作的数据吧:
/** * The company as the user entered it. * <P>Type: TEXT</P> */ public static final String COMPANY = DATA; /** * The position title at this company as the user entered it. * <P>Type: TEXT</P> */ public static final String TITLE = DATA4; /** * The department at this company as the user entered it. * <P>Type: TEXT</P> */ public static final String DEPARTMENT = DATA5; /** * The job description at this company as the user entered it. * <P>Type: TEXT</P> */ public static final String JOB_DESCRIPTION = DATA6; /** * The symbol of this company as the user entered it. * <P>Type: TEXT</P> */ public static final String SYMBOL = DATA7; /** * The phonetic name of this company as the user entered it. * <P>Type: TEXT</P> */ public static final String PHONETIC_NAME = DATA8; /** * The office location of this organization. * <P>Type: TEXT</P> */ public static final String OFFICE_LOCATION = DATA9; /** * The alphabet used for capturing the phonetic name. * See {@link ContactsContract.PhoneticNameStyle}. * @hide */ public static final String PHONETIC_NAME_STYLE = DATA10;
类型: ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE
Organization.COMPANY:对应Data.data1:表示:公司/组织
Organization.TYPE:对应Data.data2:表示类型,就是上面的三种类型
Organization.LABEL:对应Data.data3:表示自定义类型名称
Organization.TITLE:对应Data.data4:表示标题
Organization.DEPARTMENT:对应Data.data5:表示部门
Organization.OFFICE_LOCATION:对应Data.data9:表示办公位置
其它的data6、7、9、10:表示是什么呢?在不同的手机,代表可能会有差异的。
这些字段,也比较简单,后面来看看从模拟器中导入出的数据库吧:
这个时候,发现了什么?Phone字段的Data4有数据了,这是代表什么数据呢?
先看源码它代表什么:
/** * The phone number's E164 representation. This value can be omitted in which * case the provider will try to automatically infer it. (It'll be left null if the * provider fails to infer.) * If present, {@link #NUMBER} has to be set as well (it will be ignored otherwise). * <P>Type: TEXT</P> */ public static final String NORMALIZED_NUMBER = DATA4;这个是什么?看上面的注释:明白E164就知道了:
通过度娘查询到的解释:
一个E.164号码由以下几个部分组成,不同部分之间可以用“-”、“.”或空格等连接:
ENUM+国家码(1~3位数字)-地区码(n位数字)-电话号码(15-n位数字)。
例如:北京的一个电话号码写成标准的E.164格式应是:+86-10-62618501
不明白的看百科的解释:http://baike.baidu.com/view/827326.htm
说白了,只是一种标准。
再看一下存入的数据图:
data1:存入的是号码。但有些手机会有一些分隔符。但data4:是反过来的数据。
但要注意:两条同类型的数据,是没有字段作区分。
所以,操作更新的时候要注意了。。。
写到这里,基本完成。欢迎一起和大家学习交流!!!
等到最后分析完成,再上传源码。。。感谢大家的关注!!!