内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据的共享功能,是android的四大组件之一。内容提供器的用法一般有两种,一种是使用向右的内容提供器来读取和操作相应程序中的数据;另一种是创建自己的内容提供其给自己程序要共享出去的数据提供外部访问接口。
- 访问其他应用程序中的数据
- 通过Context中的getContentResolver()方法得到ContentResolver对象。Resolver意思是分解器,溶剂,把内容提供器提供的一块数据分析溶解,呵呵,我的理解。ContentResolver提供了一系列对数据进行CRUD操作。
- URI给内容提供器中的数据建立了唯一的标识符,需要作为传入CRUD的操作方法里。URI由两部分组成,”content://权限+路径”。权限是”包名.provide”。如果有子表,在provider后面加上”/table”。
Public static final Uri CONTENT_URI = Uri.parse(“content://com.WangWeiDa.MyContentProvider/users”); - 调用具体的CRUD操作方法就可以了。
Cursor cursor=null;
try {
cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactList.add(name+"\n"+number);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(cursor!=null)
cursor.close();
}
- 创建自己的内容提供器
- 自定义一个provider类继承自ContentProvider。重写实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate);
- URI格式主要有两种,以路径结尾就表示期望访问该表的中的所有数据;以id结尾就表示期望访问该表中拥有相应id的数据。我们可以利用UriMatcher对象的addURI()和match()来匹配URI。
- 在getType()方法中返回Uri对象对应的MIME类型。MIME格式
1、以vnd开头
2、如果uri以路径结尾,则后接android.cursor.dir/;如果以id结尾,则后接android.cursor.item/。
3、最后接上vnd.< authority>.< path>。
“vnd.android.cursor.dir/vnd.com.example.databasetest.provider.book”; - android中四大组件都是要在AndroidManifest中注册,ContentProvider也不例外。需要在android:name属性中制定该自定义Provider类的全名,在android:authroities属性中指定该内容提供器权限。另外,我实践过这样写还是不能让外部程序访问到我们的ContentProvider,