【Android】第十二周、内容提供者(ContentProvider)

内容提供者简介

内容提供者(ContentProvider)是Android系统四大组件之一,它是不同应用程序之间进行数据共享的标准API,通过ContentResolver类可以访问ContentProvider中共享的数据。
ContentProvider的工作原理如下:

在这里插入图片描述

ContentResolver提供一系列增删改查的方法对数据进行操作,并且这些方法以Uri的形式对外提供数据。
Uri为内容提供者中的数据建立了唯一标识符。它主要由三部分组成,scheme、authorities和path。
在这里插入图片描述

内容提供者的创建

在程序包名处点击右键选择【New】—【Other】—【Content Provider】选项
输入内容提供者的Class Name(名称)和URI Authorities(唯一标识,通常使用包名)

内容提供者创建完成后,Android Studio会自动在AndroidManifest.xml中对内容提供者进行注册。

    <application ......>
        ......	
        <provider
            android:name=".MyContentProvider"
            android:authorities="cn.itcast.mycontentprovider"
            android:enabled="true"
            android:exported="true" >
       </provider>
    </application>

访问内容提供者

在这里插入图片描述

内容观察者的使用

内容观察者(ContentObserver)是用来观察指定Uri所代表的数据的,当ContentObserver观察到指定Uri代表的数据发生变化时,就会触发onChange()方法,在该方法中使用ContentResovler可以查询到变化的数据。

要使用ContentObserver观察数据变化,就必须在ContentProviderdelete()insert()update()方法中调用ContentResolvernotifyChange()方法。

ContentObserver的两个常用方法:

public void ContentObserver(Handler handler) : ContentObserver的派生类都需要调用该构造方法。参数可以是主线程Handler,也可以是任何Handler对象(Handler将在第9章讲解)。


public void onChange(boolean selfChange) : 当观察的Uri代表的数据发生变化时,会触发该方法。在该方法中使用ContentResovler可以查询到变化的数据。

在这里插入图片描述

在这里插入图片描述

ContentResolver resolver = getContentResolver();
    Uri uri = Uri.parse("content://aaa.bbb.ccc");
    resolver.registerContentObserver(uri, true, new MyObserver(new Handler()));

    private class MyObserver extends ContentObserver{
   
        public MyObserver(Handler handler) {
   
            super(handler);
        }
        public void onChange(boolean selfChange) {
   
            super.onChange(selfChange);
            Uri uri = Uri.parse("content://aaa.bbb.ccc");//会监测该Uri的数据变化情况
            ContentResolver resolver = getContentResolver();
            Cursor cursor = resolver.query(uri, new String[] {
    "address", "date", "type", "body" }, null, null, null);
           // ......
            cursor.close();
        }
    }

案例:检测数据的猫

在这里插入图片描述
PersonDBOpenHelper 类:创建数据库和表

public class PersonDBOpenHelper extends SQLiteOpenHelper {
   

    //构造方法,调用此方法新建一个person.db的数据库并返回一个数据库帮助类的对象
    public PersonDBOpenHelper(Context context) {
   
        super(context, "person.db", null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
   
        //创建该数据库的同时新建一个info表,表中有_id,name这两个字段
        db.execSQL("create table info (_id integer primary key autoincrement, name varchar(20))");
    }
    @Override
    public
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_popo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值