声明:转载请注明出处: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很简单,不用提供了吧~