ContentProvider,及使用系统URI管理联系人

ContentProviderContentResolver是两个非常重要的概念。
如果是ContentProvider是内容提供者的话,那么ContentResolver就是内容提取者,它负责从ContentProvider中提取或处理数据。 ContentResolver通过uri告诉ContentProvider需要获取或处理哪些数据。如果要实现ContentProvider那么需要继承ContentProvider并重写其中的抽象方法:

              方 法 名 称

               方 法 描 述

insert(Uri,ContentValues)

插入

delete(Uri,String,String[])

删除

update(Uri,ContentValues,String,String[])

修改

query(Uri,String[],String,String[],Stting)

查询

getType(Uri)

获得MIME数据类型

onCreate()

当ContentProvider创建时调用

getContext()

获得Context对象



我们是在 ContentProvider 中实现我们实际操作数据的方法的。但是,客户端调用时,我们用到了另外的一个接口,它就是 ContenResolver ContentResolver 中提供和 ContentProvider 中对应的方法。我们是间接地通过操作 ContentResolver 来操作 ContentProvider 的。
ContentResolver 通过应用程序的 getContentResolver () 方法获得。一般情况下, ContentProvider 是单实例的,但是可以有多个 ContentResolver 在不同的应用程序和不同的进程之间和 ContentProvider 交互。

              方 法 名 称

               方 法 描 述

insert(Uri,ContentValues)

插入

delete(Uri,String,String[])

删除

update(Uri,ContentValues,String,String[])

修改

query(Uri,String[],String,String[],Stting)

查询


URL:
ContentProvider 又是如何共享其数据的呢?这里就要知道另外的一个概念,这便是 URI ContentProvider 就是通过该对象来共享其数据的。
一个 URI 对象必须以“ content //” 开头,接下来是 URI 的授权部分,这部分内容要和 AndroidManifest.xml 配置文件中声明的授权内容一致,后面还可能有数据类型和记录 ID
通过 URI 可以使得 ContentResolver 知道和哪个 ContentProvider 对应,并且来操作哪些表以及记录。




ContentResolver 操作数据的步骤只需两步:
1. 调用 Activity getContentResolver () 获取 ContentResolver 对象。
2. 根据需要调用 ContentResolver insert() delete() update() query() 方法操作数据。
为了操作系统提供的 ContentResolver ,只需了解该 ContentProvider Uri 即可
example:
管理联系人部分代码:
Android系统提供了Contact应用程序来管理联系人,其中用到的Uri如下:
ContactsContract.Contacts.CONTENT_URI:管理联系人的Uri。
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话Uri。
ContactsContract.CommonDataKinds.Email.CONTENT_URI:管理联系人的Email的Uri
//使用ContentResolver查找联系人数据
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);


//获取联系人ID
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));


//获取联系人的姓名
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//根据联系人的ID查找该联系人下的所有电话
Cursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?", new String[]{contactId}, null);


while(phoneCursor.moveToNext()){
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
infoList.add("电话号码:"+phoneNumber);
}
//根据联系人的ID查找该联系人下的所有Email
Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?", new String[]{contactId}, null);


while(emailCursor.moveToNext()){
String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
infoList.add("mail:"+email);
}
ContentValues values = new ContentValues();
//向RawContacts插入一个空值,目的为了得到增加联系人的ID
Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);
//获取Uri中的id
long rawContactId = ContentUris.parseId(rawContactUri);


//增加姓名
values.clear();
//指定此姓名相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加姓名的MIME类型
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
//设置添加的姓名为该联系人的姓名
values.put(StructuredName.GIVEN_NAME, name);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);


//增加电话
values.clear();
//指定此电话相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加电话的MIME类型
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
//设置添加电话属于什么类型(手机、住宅或办公等等)
values.put(Phone.TYPE,Phone.TYPE_MOBILE);
//设置添加的电话为该联系人的电话
values.put(Phone.NUMBER, phone);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);


//增加email
values.clear();
//指定此email相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加email的MIME类型
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
//设置添加email属于什么类型(家用或办公等等)
values.put(Email.TYPE,Email.TYPE_WORK);
//设置添加的email为该联系人的email
values.put(Email.DATA, email);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);






你可能感兴趣的:(android)