«

Android四大组件之~~ContentProvider

时间:2024-3-2 17:31     作者:韩俊     分类: Android


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

标签: android

热门推荐