Android Contact 数据结构之AccountType
- AccountType介绍
AccountType是标注一个联系人存储的时候的账户类型, 就是我们在存储联系人时选择存储到什么地方后设置的值,为联系人指定Accounttype主要是为了标识该联系人能够保存哪些数据. 例如说SimAccountType就只能够保存联系人的姓名, 和一项电话号码.
主要的AccountType有BaseAccountType,SimAccounType,USimAccountType,UimAccountType,GoogleAccountType,ExchangeAccountType。 AccountType是一个抽象类具体的实现是在BaseAccountType中。 BaseAccountType是AccountType的直接子类,而其他的账户类型都继承自BaseAccountType.
一个联系人能够保存哪些数据主要由AccountType中的mMimeKinds(ArrayList<DataKind>)变量所决定,这个变量保存了这个AccountType类型的联系人能够存储哪些数据。一个DataKind表示一个MIME类型的支持的所有数据类型。
所有的MIME类型存在/data/data/com.android.providers.contacts/databases/contacts2.db 数据库中的mimetypes表中。
- DataKind介绍
DataKind能够保存相同MIME类型的子类型,一个DataKind对象对应一个MIME类型。他的一些重要属性:
- public String mimeType; //表示该DataKind标识的是那种mime。
- public int typeOverallMax; //表示的该DataKind能够在联系人添加时出现几次一般都只是一次 ,-1表示不限制。
- public List<EditType> typeList; //表示该DataKind包含的所有EditType类型
- public List<EditField> fieldList; //表示该DataKind包含的所有EditField类型(EditType和EditField将在后面进行讲解)
- EditType介绍
EditType是AccountType的一个内部内,表示一个数据类型的数据的一个标签,比如说:PhoneNumber 的 Mobile标签, 一个EditType对应到数据库中就是data表中的一行数据。它的一些重要数据:
- public int specificMax; //表示一个联系人中该数据类型的该标签最多能够添加多少个,-1表示不限制。
- public int labelRes; //表示这个标签的显示名称
- public int rawValue; //这个标签的标识,值从framework中的ContactConstract.java中来。
- EditField介绍
EditField同样也是AccountType的一个内部内,表示一个数据类型的字段,比如说:Name 的First name字段,一个EditField对应数据库中就是data表中的一列数据。对应DataKind中一个fieldList对应data表的一行数据。它的一些重要数据:
- public String column; // 因为在data表中表示为一列数据,所以这个属性就是记录它是放到数据库中的哪一列。
- public int titleRes; //这个字段在界面上显示为什么
- public int inputType; //表示输入的类型。
可能这里看这个觉得没什么意义,后面我们会先看看EntityDelta相关的数据结构后再来完整的追一次联系人添加的流程。这样可能会清楚一些。 (分享主要是基于android4.0 版本的代码)