声明:转载请注明出处:http://blog.csdn.net/Hello_Chillax/article/details/45669473
开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BrocastReserver。今天来介绍其一:ContentProvider。
ContentProvider:
顾名思义,内容提供者。实现了不同程序之间数据的分享。简单地说,就是程序B可以通过得到程序A中的Provider来获取A中的数据。
下面通过一个例子来讲解ContentProvider的完整使用过程。
1 首先我们来创建提供数据的程序A:
1.1 创建一个Provider:
public class MyProvider extends ContentProvider {
private static final String AUTHORITY = "com.example.a_provider.MyProvider";
private static final int INSERT_CODE = 0;
private static final int DELETE_CODE = 1;
private static final int UPDATE_CODE = 2;
private static final int QUARY_CODE = 3;
private static UriMatcher uriMatcher;
static {
// 静态代码块,只在创建之初执行一次
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 添加访问的方式:
// 添加插入操作:AUTHORITY/insert,下面的类似
//查找时可以用:content://com.example.a_provider.MyProvider/insert
uriMatcher.addURI(AUTHORITY, "insert", INSERT_CODE);
// 同上,删
uriMatcher.addURI(AUTHORITY, "delete", DELETE_CODE);
// 改
uriMatcher.addURI(AUTHORITY, "update", UPDATE_CODE);
// 查单个数据
uriMatcher.addURI(AUTHORITY, "quary", QUARY_CODE);
}
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 查询是否是匹配该内容提供者的authority,这里authority的作用就体现出来了。
switch (uriMatcher.match(uri)) {
// 如果返回码是QUARY_CODE,说明应该执行query操作:
case QUARY_CODE:
return null;
default:
throw new IllegalArgumentException("not match query!");
}
}
@Override
public String getType(Uri uri) {
return "vnd.android.cursor.item" ;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// 查询是否是匹配该内容提供者的authority,这里authority的作用就体现出来了。
switch (uriMatcher.match(uri)) {
// 如果返回码是INSERT_CODE,说明应该执行insert操作:
case INSERT_CODE:
return Uri.parse("insert success");
default:
throw new IllegalArgumentException("not match insert!");
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// 查询是否是匹配该内容提供者的authority,这里authority的作用就体现出来了。
switch (uriMatcher.match(uri)) {
// 如果返回码是DELETE_CODE,说明应该执行delete操作:
case DELETE_CODE:
return 0;
default:
throw new IllegalArgumentException("not match delete!");
}
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// 查询是否是匹配该内容提供者的authority,这里authority的作用就体现出来了。
switch (uriMatcher.match(uri)) {
// 如果返回码是UPDATE_CODE,说明应该执行update操作:
case UPDATE_CODE:
return 0;
default:
throw new IllegalArgumentException("not match update!");
}
}
}
1.2 然后需要在manifest中声明这个provider,和Activity类似。
<provider
<!-- android:exported必须设置为true,否则外界访问不到 -->
android:exported="true"
android:name="com.example.a_provider.MyProvider"
<!-- 设置provider的主机名,也就是外界通过这个字符串来找到这个provider。 -->
android:authorities="com.example.a_provider.MyProvider"
<!-- 设置访问该provider所需要声明的权限(以前都是使用权限,这里我们反过来给使用者设置权限) -->
<!-- 权限的名字是随便起的,只要是不重复就行,而且权限的数目也不固定 -->
android:readPermission="aa.bb.cc.reader"
android:writePermission="aa.bb.cc.writer" >
</provider>
1.3 我们为访问这个provider的程序提供了两个permission,需要声明一下
<permission android:name="aa.bb.cc.reader" >
</permission>
<permission android:name="aa.bb.cc.writer" >
</permission>
好了,到此,我们的provider已经设置成功了。
2 然后我们来调用这个provider。
2.1 在MainActivity中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
insert();
}
public void insert(){
//这里的Uri就是provider的访问路径,还记得我们上面设置的那个authorities吗,这里用到了:content://authorities/#
//使用的格式是:
Uri uri=Uri.parse("content://com.example.a_provider.MyProvider/insert");
//内容提供者访问对象:
ContentResolver resolver=getContentResolver();
ContentValues values=new ContentValues();
//可以添加数据
values.put("凤姐", 20);
//进行插入操作:
Uri uri2 =resolver.insert(uri, values);
//输出结果:uri2:inset success
System.out.println("uri2:"+uri2.toString());
}
2.2 最后,别忘了再manifest中声明权限:
<uses-permission android:name="aa.bb.cc.writer"/>
<uses-permission android:name="aa.bb.cc.reader"/>
至此,我们实现了provider的创建,设置权限,并通过另一个程序进行访问,整个流程就是这么简单~
OK,有不懂的欢迎留言询问。demo很简单,不用提供了吧~