标签:cursor 源码 contentresolver
Android的四大组件之一,ContentProvider,分为两个部分:一是数据组织工具ContentProvider,一是数据调用工具ContentResolver。对于系统已经提供的URI,如通讯录、多媒体、短信等,通常可以不需要再建立额外的数据库,再用ContentProvider进行组织,而是可以直接用ContentResolver调用这些URI,对系统数据库进行增删改查等操作,从而保证整个Android设备中数据的统一。
下面这个链接是本人前段时间为了参加MM论坛的一个小比赛所做的通讯录小demo的源码。因为最近工作和生活的一些原因,把比赛的截止日期给耽误了,所以到最后也没做美工。
如下是对通讯录表进行添加和删除的处理类ContactHandler:
-
import android.content.ContentResolver;
-
import android.content.ContentUris;
-
import android.content.ContentValues;
-
import android.content.Context;
-
import android.provider.ContactsContract.Data;
-
import android.provider.ContactsContract.RawContacts;
-
import android.provider.ContactsContract.CommonDataKinds.Phone;
-
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-
-
public class ContactHandler {
-
private Context context;
-
-
public ContactHandler(Context context) {
-
this.context = context;
-
}
-
-
public void create(ContactItem item) {
-
ContentResolver resolver = context.getContentResolver();
-
ContentValues values = new ContentValues();
-
-
long rawContactId = ContentUris.parseId(resolver.insert(RawContacts.CONTENT_URI, values));
-
-
values.clear();
-
values.put(Data.RAW_CONTACT_ID, rawContactId);
-
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
-
values.put(StructuredName.DISPLAY_NAME, item.getValue(ContactItem.TYPE_NAME));
-
resolver.insert(Data.CONTENT_URI, values);
-
-
values.clear();
-
values.put(Data.RAW_CONTACT_ID, rawContactId);
-
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
-
values.put(Phone.NUMBER, item.getValue(ContactItem.TYPE_PHONE));
-
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
-
resolver.insert(Data.CONTENT_URI, values);
-
}
-
-
public void delete(ContactItem item) {
-
ContentResolver resolver = context.getContentResolver();
-
-
String[] args = {item.getValue(ContactItem.TYPE_CONTACT_ID)};
-
-
resolver.delete(RawContacts.CONTENT_URI, Data.CONTACT_ID + "=?", args);
-
resolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=?", args);
-
}
-
}
如下是一次性获取通讯录列表信息的类ContractGenerator:
-
import java.io.InputStream;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
import android.content.ContentResolver;
-
import android.content.ContentUris;
-
import android.content.Context;
-
import android.database.Cursor;
-
import android.graphics.Bitmap;
-
import android.graphics.BitmapFactory;
-
import android.net.Uri;
-
import android.provider.ContactsContract.Contacts;
-
import android.provider.ContactsContract.CommonDataKinds.Phone;
-
import android.provider.ContactsContract.CommonDataKinds.Photo;
-
-
public class ContactGenerator {
-
private Context context;
-
-
private static final String[] PROJECTECTION = {
-
Phone.DISPLAY_NAME,
-
Phone.NUMBER,
-
Photo.PHOTO_ID,
-
Phone.CONTACT_ID,
-
};
-
private static final int DISPLAY_NAME_INDEX = 0;
-
private static final int PHONE_NUMBER_INDEX = 1;
-
private static final int PHOTO_ID_INDEX = 2;
-
private static final int CONTACT_ID_INDEX = 3;
-
-
public ContactGenerator(Context context) {
-
this.context = context;
-
}
-
-
public List<ContactItem> generateList() {
-
List<ContactItem> list = new ArrayList<ContactItem>();
-
-
ContentResolver resolver = context.getContentResolver();
-
Cursor cursor = resolver.query(Phone.CONTENT_URI, PROJECTECTION, null, null, PROJECTECTION[DISPLAY_NAME_INDEX] + " ASC");
-
while (cursor.moveToNext()) {
-
String name = cursor.getString(DISPLAY_NAME_INDEX);
-
String phone = cursor.getString(PHONE_NUMBER_INDEX);
-
long photoId = cursor.getLong(PHOTO_ID_INDEX);
-
long contactId = cursor.getLong(CONTACT_ID_INDEX);
-
-
Bitmap head = null;
-
if (photoId > 0) {
-
Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
-
InputStream input = Contacts.openContactPhotoInputStream(resolver, uri);
-
head = BitmapFactory.decodeStream(input);
-
}
-
-
ContactItem item = new ContactItem(context, name, phone, head);
-
item.setContactId(contactId);
-
list.add(item);
-
}
-
-
return list;
-
}
-
}
对系统通讯录数据库进行操作,需要在AndroidManifest.xml文件中添加如下两个用户权限:
-
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
-
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
对于ContentResolver的使用,主要是如下几个步骤:
1. 通过Context的getContentResolver()方法获取ContentResolver实例;
2. 调用ContentResolver的insert、delete、update、query方法对数据表进行增删改查操作,对数据表的指定是通过系统URI来完成,这些URI会作为参数传入上述4个方法中。详情参见Android API文档。
另外,如下的博文分享了包括通讯录、多媒体、短信在内的系统URI:
http://blog.csdn.net/lyx2007825/article/details/7280043
就本文中的示例而言,Java源码文件如下图:
除了前述两个对ContentResolver的操作外,本通讯录的UI控件主要基于二级列表ExpandableListView,所以有继承自BaseExpandableListAdapter的二级列表数据处理适配器类ContactAdapter。另外,ContactItem是数据实体类。其余两个Activity类的界面类。
最后需要说明的是,对于系统已经提供了URI的数据资源,没有必要再用ContentProvider对其进行封装管理,因而本示例中并没有用到ContentProvider,只用到ContentResolver。
微天下版主修改 www.imvbo.com
Android编程,通过ContentResolver调用系统URI实现的通讯录示例
标签:cursor 源码 contentresolver
原文地址:http://blog.csdn.net/jsmen_lbg/article/details/43867785