ContactsContract.Data
extends Object
implements ContactsContract.DataColumnsWithJoins
Class Overview:
该类中包含一些和原始联系资料相关的数据表常量,数据表中的每一行都用来存储联系信息(如电话号码)和元数据(such as whether it is a work or home number)
Data kinds
Data是一个能保存任何类型的联系数据的普通表,数据的类型存储在指定的行(用MIMETYPE来限定),这决定了每一列的含义(从DATA1到DATA15),
例如,如果数据类型是Phone.CONTENT_ITEM_TYPE,那么DATA1这一列用来存储phone number,
如果数据类型是Email.CONTENT_ITEM_TYPE,那么DATA1这一列存储的是email address.
Sync adapters 和 applications 能够使用它们自己的数据类型
为了方便,ContactsContract定义了一小部分 预定义 的数据类型,例如 ContactsContract.CommonDataKinds.Phone,ContactsContract.CommonDataKinds.Email
这些类为DATA1列定义特殊的别名,例如Phone.NUMBER和Data.DATA1是一样的.
DATA1是一个indexed column,它应该存储(查询时用到最多的)数据,
如:当某一行用来存储email地址时,DATA1应该用来存储email地址本身,DATA2可以用来存储辅助信息,如email地址的类型(家庭、工作等)
依照惯例, DATA15用来存储BLOBs (binary data),即二进制数据.
指定account type的sync adapter(同步适配器)必须正确地处理raw contacts中的每一种数据类型. 否则可能导致误用或丢失数据.
同样地, 你应该避免介绍其他类型账户(other party's account type)中的数据类型。
例如,如果你添加一行数据"favorite song"到Google account拥有的raw contact中, 它将不会得到服务器的同步,因为Google sync adapter
不知道怎么处理这种数据类型,所以新的数据类型应该和新的account types一次定义,即new sync adapters.
Batch operations
Data rows能够执行inserted/updated/deleted等操作,传统的用法为
insert(Uri, ContentValues),
update(Uri, ContentValues, String, String[]),
delete(Uri, String, String[]),最新的基于批处理的操作机制被证明是一种更好的选择,它适用于任何情况.
所有的一批操作在同一个事务中执行,它能保证phone-side和server-side总是一致的,同时基于批操作的方法效率也更高:
不仅是因为所有的数据库操作在同一个事务中执行, 在不同的content provider之间发送批处理命令也节省了很多时间。
Operations
Insert
单独的数据行可以采用传统的插入方法insert(Uri, ContentValues). 多行插入应该采用批处理方式.
传统插入方法:
ContentValues values = new ContentValues();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, "1-800-GOOG-411");
values.put(Phone.TYPE, Phone.TYPE_CUSTOM);
values.put(Phone.LABEL, "free directory assistance");
Uri dataUri = getContentResolver().insert(Data.CONTENT_URI, values);
用ContentProviderOperations来实现:
ArrayList<ContentProviderOperation> ops = Lists.newArrayList();
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValue(Data.RAW_CONTACT_ID, rawContactId)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, "1-800-GOOG-411")
.withValue(Phone.TYPE, Phone.TYPE_CUSTOM)
.withValue(Phone.LABEL, "free directory assistance")
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Update
和insert一样, update即可以单独插入也可以批量插入, 推荐采用批量更新:
ArrayList<ContentProviderOperation> ops = Lists.newArrayList();
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
.withValue(Email.DATA, "somebody@android.com")
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Delete
和insert、update一样, 删除既可以采用delete(Uri, String, String[])也可以采用ContentProviderOperation:
ArrayList<ContentProviderOperation> ops = Lists.newArrayList();
ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
.withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Query
查找指定contact的指定MIMETYPE的所有的数据
Cursor c = getContentResolver().query(Data.CONTENT_URI,
new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
Data.CONTACT_ID + "=?" + " AND "
+ Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
new String[] {String.valueOf(contactId)}, null);
查找指定raw contact的指定MIMETYPE的所有的数据
Cursor c = getContentResolver().query(Data.CONTENT_URI,
new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
Data.RAW_CONTACT_ID + "=?" + " AND "
+ Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
new String[] {String.valueOf(rawContactId)}, null);
查找指定raw contact的所有数据
大多数sync adapters想要连同raw contact一起读取它的所有数据行,这里应该使用ContactsContract.RawContactsEntity
另一方面,大量的批处理操作会让数据库锁住一段时间以避免其他应用程序的访问,也可能导致"Application Not Responding"为了避免数据库被锁住,请确保在批处理操作中插入屈服点(yield points).屈服点知识content provider,在执行下一个操作前,它可以提交已经改变的数据,屈服于其他请求,开启另一个事务并执行,屈服点不会自动提交,除非有另一个请求数据库的操作。通常sync adapter应该在每一个批处理操作队列前插入一个屈服点。请查看withYieldAllowed(boolean).
ContactsContract.Contacts.Data extends Object implements BaseColumns ContactsContract.DataColumns
ContactsContract.RawContacts.Data
extends Object implements BaseColumns ContactsContract.DataColumns
Class Overview
单独的raw contact子目录,包含它的 ContactsContract.Data
的所有行. 要访问这个目录需要在
contact URI后面添加CONTENT_DIRECTORY
. TODO: deprecate in favor of ContactsContract.RawContacts.Entity
.
ContactsContract.Contacts.Data
extends Object implements BaseColumns ContactsContract.DataColumns
Class Overview
单独的raw contact子目录,包含所有的有权限的raw contact ContactsContract.Data
行.
我们注意到它们实现的接口不同,分别为
ContactsContract.Data extends Object implements ContactsContract.DataColumnsWithJoins
ContactsContract.Contacts.Data extends Object implements BaseColumns,ContactsContract.DataColumns
ContactsContract.RawContacts.Data extends Object implements BaseColumns,ContactsContract.DataColumns
ContactsContract.DataColumnsWithJoins,绑定查询 ContactsContract.Data
table时返回的所有列.
ContactsContract.DataColumns,ContactsContract.Data
table中的所有列