参考:http://blog.csdn.net/chuyuqing/article/details/39995607
1.定义: 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
2.ContentProvider的应用场景
为读取和储存数据提供了统一的接口.
使用contentprovider可以使用应用程序之间的数据共享
Android内置的数据都是contentprovider形式的,共开发者调用:如图片.音频.通讯录等
3.contentprovider查询的统一格式uri
由三部分组成
“content://
content://media/internal/images 这个URI将返回设备上存储的所有图片
content://contacts/people/ 这个URI将返回设备上的所有联系人信息
content://contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录)”
Android提供的uri的辅助类:
(在android.provider包下),里面包含了很多以类变量形式给出的查询字符串,这种方式更容易让我们理解一点,因此,如上面content://contacts/people/45这个URI就可以写成如下形式:
Uri person = ContentUris.withAppendedId(People.CONTENT_URI, 45);
4.具体应用以手机通讯录为例添加权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
1.查询通讯录
//查询记录
private void displayRecords() {
//该数组中包含了所有要返回的字段
String columns[] = new String[]{Contacts.People.NAME, Contacts.People.NUMBER};
Uri mContacts = Contacts.People.CONTENT_URI;
Cursor cur = managedQuery(mContacts, columns, null, null, null);
if (cur.moveToFirst()) {
String name = null;
String phoneNo = null;
do {
// 获取字段的值
name = cur.getString(cur.getColumnIndex(Contacts.People.NAME));
phoneNo = cur.getString(cur.getColumnIndex(Contacts.People.NUMBER));
Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
} while (cur.moveToNext());
}
}
2.修改通讯录
//修改通讯录
private void updateRecord(int recNo, String name) {
Uri uri = ContentUris.withAppendedId(Contacts.People.CONTENT_URI, recNo);
ContentValues values = new ContentValues();
values.put(Contacts.People.NAME, name);
getContentResolver().update(uri, values, null, null);
}
3.插入通讯录
//添加记录
private void insertRecords(String name, String phoneNo) {
ContentValues values = new ContentValues();
values.put(Contacts.People.NAME, name);
Uri uri = getContentResolver().insert(Contacts.People.CONTENT_URI, values);
Uri numberUri = Uri.withAppendedPath(uri, Contacts.People.Phones.CONTENT_DIRECTORY);
values.clear();
values.put(Contacts.Phones.TYPE, Contacts.People.TYPE_MOBILE);
values.put(Contacts.People.NUMBER, phoneNo);
getContentResolver().insert(numberUri, values);
}
4.删除通讯录
//删除记录
private void deleteRecords() {
Uri uri = Contacts.Phones.CONTENT_URI;
getContentResolver().delete(uri, null, null);
}