您的位置:首页 > 编程语言 > PHP开发

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

2013-07-16 20:37 615 查看
ContentProvider和ContentResolver是两个非常重要的概念。

如果是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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: