4.四大组件之内容提供者 ContentProvider

内容提供者介绍

 

 

   按照我们上节课创建的数据库,按照linux里的权限规则,每三个一组,第一组表示自己的权限,第二组表示与自己同组的权限,第三组表示第三方用户的权限。

所以,第三方用户是没有权限执行本应用的内容的。于是,就需要这么一个内容提供者了。

内容提供者应用场景:

向日历里插入提醒事件:

微信、QQ,支付宝获取通讯录里的联系人

安卓媒体库:比如说要发朋友圈了,或者应用要上传图片,获取系统里的图片内容视频内容也可以通过内容提供者获取。

广告精准推送:去淘宝后,头条也能收到推荐。

例子
public class UserProvider extends ContentProvider
我们的四大组件,每次创建都得去注册!
<provider
    android:authorities="com.example.mycontentprovider"
    android:name=".provider.UserProvider"/>
android:authorities目前来说一般填包名
authorities 就是个令牌,让我们如何找到它  一般填写包名

 

 接着我们之前复习的数据库代码进行搭建,现在我们写内容提供者:

 

package com.example.mycontentprovider2.provider;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

import com.example.mycontentprovider2.db.MydbHelper;
import com.example.mycontentprovider2.utils.Contants;

//内容提供者是给别的app提供内容的
public class UserProvider extends ContentProvider {

    /***************目前这样的话数据库内容谁都能拿到了,咋办?用uri控制一下****/
    private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    //匹配码
    private static final int USER_MATCH_CODE = 1;

    static {
        //添加一些uri规则(path怎么用我们后面再说)
        uriMatcher.addURI("com.example.mycontentprovider2",null,USER_MATCH_CODE);
    }

    /***********************提供数据库的内容*************************************/
    MydbHelper mydbHelper;

    public UserProvider() {
    }

    //系统自动调用
    @Override
    public boolean onCreate() {
        //如果没创建数据库或者表就创建,双保险
        mydbHelper = new MydbHelper(getContext());
        return false;
    }

    /***************************增删改查现在我们看的很熟悉吧**********************/
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        //匹配一下规则
        int result = uriMatcher.match(uri);
        if (result == USER_MATCH_CODE){
            //匹配规则
            SQLiteDatabase db = mydbHelper.getWritableDatabase();
            Cursor cursor = db.query(Contants.TB_NAME, projection, selection, selectionArgs, null, null, sortOrder);
            return cursor;
        }else {
            //不匹配规则   我给他抛出一个参数违法异常
            throw new IllegalArgumentException("主动抛的参数违法异常");
        }

    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // Implement this to handle requests to delete one or more rows.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO: Implement this to handle requests to insert a new row.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        // TODO: Implement this to handle requests to update one or more rows.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public String getType(Uri uri) {
        // TODO: Implement this to handle requests for the MIME type of the data
        // at the given URI.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

 

现在我们写内容解析者  点击按钮即可获取数据

//通过内容解析者拿到内容提供者提供的内容
    public void myGetProvider(View view) {
        ContentResolver contentResolver = getContentResolver();
        //解析规则
        Uri uri = Uri.parse("content://com.example.mycontentprovider2");
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        String[] columnNames = cursor.getColumnNames();
        //打印出数据库表的表头
        for (String columnName : columnNames) {
            Log.e("数据库表的表头",columnName);
        }
        //遍历数据
        while (cursor.moveToNext()){
            for (String columnName : columnNames) {
                String string = cursor.getString(cursor.getColumnIndex(columnName));
                Log.e("字段名"+columnName,string);
            }
        }
        cursor.close();
    }

关于path

 

 

 

 

条件

 

posted @ 2021-09-17 17:09  涂妖教  阅读(104)  评论(0)    收藏  举报