内容提供者

一.ContentProvider介绍:

1.ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能。
2.技能get点:
(1)访问系统自带的内容提供者(******)
手机联系人/音频/视频/图库/短信/系统设置
(2)自己写内容提供者
3.注意:

在这里插入图片描述

二.原理图

在这里插入图片描述

三.一系列权限

<!-- 短信的权限 -->
    <uses-permission android:name="android.permission.WRITE_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <!-- 手机联系人权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <!-- 读写SD卡的全选 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 通讯录权限 -->
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
    <uses-permission android:name="android.permission.INTERNET"/>

四.动态获取权限

//权限数组
        String[] strings = new String[]{Manifest.permission.INTERNET,Manifest.permission.READ_SMS,
                Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_CALL_LOG,Manifest.permission.WRITE_CALL_LOG,
                Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS,
                Manifest.permission.RECEIVE_SMS};
        //TODO 1: 判断手机安卓版本 安卓6.0以后SDK版本都是23
        if(Build.VERSION.SDK_INT>=23){
            //TODO 2: 判断权限是否授权过
            for (int i=0;i<strings.length;i++){
                int permission = ActivityCompat.checkSelfPermission(this, strings[i]);
                //TODO 3:判断结果  授权:PERMISSION_GRANTED    没有授权:PERMISSION_DENIED
                if(permission == PackageManager.PERMISSION_DENIED){
                    requestPermissions(strings,101);
                    break;
                }
            }
        }

五.自定义内容提供者

一.什么是自定义内容提供者
谈到内容提供者,大家就应该想到提供方和索要方,之前我们获取手机联系人,提供方是系统APP本身,索要方是我们;现在,我们想要做提供方,别人来访问我们的数据库,那我们就需要自定义内容提供者了。
在这里插入图片描述

自定义内容提供者思路

1.提供方:ContentProvider
(1)创建数据库,自定义类继承SQLiteOpenHelper
(2)自定义内容提供者类,继承ContentProvider,重写insert/delete/update/query方法,向外界提供方法
(3)清单文件中注册内容提供者
2.索要方:ContentResolver
(1)通过Context的getContentResolver方法获得ContentResolver对象
(2)确定uri
(3)调用insert/delete/update/query方法访问数据库

创建提供者代码

(1)自定义类继承SQLiteOpenHelper

public class MyHelper extends SQLiteOpenHelper {
    public MyHelper(Context context) {
        super(context, "my_provider.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table student(id integer primary key autoincrement,name varchar(20),age integer)");
        for(int i=0;i<50;i++){
            ContentValues values = new ContentValues();
            values.put("name","张"+i);
            values.put("age",i);
            db.insert("student",null,values);
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

(2)自定义内容提供者类,继承ContentProvider

public class MyProvider extends ContentProvider {
    SQLiteDatabase database;
    static final String TABLE_NAME="student";
    //创建
    @Override
    public boolean onCreate() {
        MyHelper myHelper = new MyHelper(getContext());
        database = myHelper.getWritableDatabase();
        if(database==null){
            return  false;
        }else{
            return true;
        }
    }

    //查询
    @Override
    public Cursor query( Uri uri, String[] projection, String selection,String[] selectionArgs,String sortOrder) {
        Cursor query = database.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
        return query;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    //增加
    @Override
    public Uri insert(Uri uri,ContentValues values) {
        database.insert(TABLE_NAME,null,values);
        return uri;
    }

    //删除
    @Override
    public int delete( Uri uri,String selection,String[] selectionArgs) {
        return database.delete(TABLE_NAME,selection,selectionArgs);
    }

    //修改
    @Override
    public int update( Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return database.update(TABLE_NAME,values,selection,selectionArgs);
    }
}

(3)清单文件中注册内容提供者

<provider
            android:exported="true"
            android:authorities="com.xh.day8"
            android:name=".MyProvider"/>

内容索要方代码

(1)获取ContentResolver直接获取

确定Uri:conten://com.bawei 前面一定要加conten://
uri=Uri.parse("content://com.bawei");
        contentResolver=getContentResolver();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值