关于Content Provider中Contacts的一些知识

原创 2012年03月29日 22:00:25

         ContactsContract  类中有很多内嵌的类帮助操作Contect Provider中的Contracts,其中用的比较多的有Data类对应数据库的Data表(比较重要)、RawContrats类对应的raw_contacts表、Groups类对应的groups表。Data表非常重要,用于存储各种类型的数据,用MIMEType类进行区分,数据存储在Data1~Data15中,各种类型不一样,需要查看相应的MIMEType,例如有如下一些类型(来源于http://developer.android.com/reference/android/provider/ContactsContract.Data.html):

The MIME type of the item represented by this row. Examples of common MIME types are:

下表是利用sqlite Manager查看虚拟机中导出的Provider.Contacts中的Data表中的键的情况,与Android Developer的开发文档对应的描述对应。

                                                         Data表

同理:rawContacts、Groups表也有相应的对应情况,值得注意的是这几个表相互联系,例如Data表中的通过raw_contact_id与raw_contacts表中的_id相联系,构成多对一关系,group表中的 _id与Data表中的Data1对应(前提是MIMETYPE= ContactsContract.CommonDataKinds.GroupMemeberShip),因此推理,Data表可以与其他的表进一步向关联,所以Data表应该是所有表的中介。当然这些表之间也有冗余,猜测其目的是为了方便于查找的,因此如果要对表进行更改,需要注意有没有相联系的表需要进行相应的更改操作(好像这里有隐含同步的操作方式,只要操作一个表,同步机制会相应的更改联系的表,待以后研究)


参考文档中还推荐了几种操作的代码,可供参考:

Insert

An individual data row can be inserted using the traditional insert(Uri, ContentValues) method. Multiple rows should always be inserted as a batch.

An example of a traditional insert:

 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);
 

The same done using ContentProviderOperations:

 ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();

 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

Just as with insert, update can be done incrementally or as a batch, the batch mode being the preferred method:

 ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();

 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

Just as with insert and update, deletion can be done either using the delete(Uri, String, String[]) method or using a ContentProviderOperation:

 ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();

 ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
          .withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
          .build());
 getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
 
Query

Finding all Data of a given type for a given contact
 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);
 

Finding all Data of a given type for a given raw contact
 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);



相关文章推荐

使用ContentProviderOperation 来提升应用性能

ContentProviders 是android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端。...
  • imuhao
  • imuhao
  • 2016年07月23日 10:44
  • 863

ContentProviderOperation批量操作提升性能

ContentProviders 是Android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端。有时候你需要更新多行数据,...

11_android系统联系人(更新用户名称为例)介绍ContentProviderOperation的使用

package com.example.contactdemos.test; import java.util.ArrayList; import android.content.ContentP...

android 黑名单 短信拦截

上一篇讲了电话拦截,现在讲一下短信拦截。 由于android4.4以上,提高了系统的安全性,同时,也对短信的处理进行了保护 先来讲一下在android4.4以下的短信拦截机制 在androi...

使用ContentProviderOperation 来提升应用性能

ContentProviders 是android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端。...
  • imuhao
  • imuhao
  • 2016年07月23日 10:44
  • 863

Android Content Providers(二)——Contacts Provider

接上篇Android内容提供者——Content Providers(一) Contacts Provider是Android中一个强大并且灵活的组件,负责管理系统通讯录的数据,对外提供访问接口来对...

Android Content Providers(三)——Contacts Provider

接着上篇Android Content Providers(二)——Contacts Provider继续,接下来要说明的是顶层的Contacts,Contacts是聚合联系人表,在之前讨论的RawC...

使用Contacts Contract Content Provider操作通讯录最佳实践

Android向所有被赋予READ_CONTACTS权限的应用程序提供了联系人信息数据库的完全访问权限。Contacts Contract使用3层数据模型去存储数据,下面介绍Contacts Cont...
  • sdksdk0
  • sdksdk0
  • 2015年12月23日 10:45
  • 621

Android Content Provider 之Contacts数据库操作

openContactPhotoInputStream Android 设置及获取联系人照片的方法 查询,新增,删除,更新联系人方法...

Android contacts content provider学习小结

最近想做一个功能,能够获取android最近修改的联系人,包括added/updated/deleted。虽然最后还是没有找到很好的办法,但顺便学习了下Android contacts content...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Content Provider中Contacts的一些知识
举报原因:
原因补充:

(最多只允许输入30个字)