内容提供者

内容提供者 contentProvider

--------此笔记根据黑马程序员的授课视频所记录
Activity
网络编程1
网络编程2
广播接收者
服务
内容提供者
多媒体

1.为什么要使用内容提供者

​ 【1】(回顾)如何创建一个数据库 创建一个类MyOpenHelper去继承SQLiteOpenHelper
在这里插入图片描述在这里插入图片描述

Linux权限图

在这里插入图片描述

chmod指令 可以修改Linux下的文件权限(10进制)

【2】如果程序想访问别的程序下的私有数据库,要通过通过一个方法叫openDatabase来获取到SQLiteDatabase对象,还要通过chmod命令在adb shell里面修改数据库的权限,此时显然过于麻烦,而且不好实现,所以有了内容提供者

/**
 * path:路径
 * factory 游标工厂
 * flags 访问的模式
 */
SQLiteDatabase.openDatabase(path,factory,flags);

【4】使用内容提供者 把私有的数据库内容给暴露出来

2.内容提供者原理

在这里插入图片描述

官方文档介绍翻译(机翻):

内容提供者是Android应用程序向应用程序提供内容的主要构建块之一(四大组件之一)。它们通过单个ContentResolver接口封装数据并提供给应用程序。只有在需要在多个应用程序之间共享数据时,才需要内容提供程序。例如,多个应用程序使用联系人数据,并且必须存储在内容提供程序中。如果不需要在多个应用程序之间共享数据,可以直接通过sQLiteDatabase使用数据库。

当通过ContentResolver发出请求时,系统检查给定URI的权限,并将请求传递给在该权限下注册的内容提供者。内容提供者可以按照自己的意愿解释URI的其余部分。UriMatcher类有助于解析uri

需要实现的主要方法有:

onCreate()来初始化提供程序

query(Uri, String [], String, String [], String),它向调用者返回数据

insert (Uri, ContentValues),它将新数据插入到提供的内容中

update(Uri、ContentValues、String、String []),用于更新内容提供程序中的现有数据

delete (Uri, String, String[])从提供的内容中删除数据

getType (Uri),它返回内容提供程序中数据的MIME类型

数据访问方法(如insert (Uri, ContentValues)和update (Uri, ContentValues, String, String[])可以同时从多个线程调用,而且必须是线程安全的。其他方法(如onCreate())只能从应用程序主线程调用,必须避免执行冗长的操作。有关它们预期的线程行为,请参见方法描述

内容提供者把数据进行封装然后提供出来 其他应用都是通过内容解析者来访问

3.实现内容提供者的步骤

【1】定义内容提供者 定义一个类继承contentProvider

【2】在清单文件里配置内容提供者

【3】写一个静态代码块 添加匹配规则

	//[1]定义一个UriMatcher   定义路径适配器
    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  	//定义匹配码
	private static final int QUERYSUCESS = 0;
    //[2]定义静态代码块 定义匹配规则  随着类的加载,静态代码块就执行,且只执行一次
    static {
        /**
         * authority:要和清单文件里配置的authorities一样
         * path:随意字符串
         * 下面参数配置好的Uri是:com.fjh.provider/query
         * code:匹配码
         */
        sURIMatcher.addURI("com.fjh.provider","query",QUERYSUCESS);
    }

【4】暴露你想暴露的方法(增删改查)

在这里插入图片描述

【5】现在其他的应用就可以通过内容解析着来操作数据库了

在上下文环境下直接获取

在这里插入图片描述

4.读取联系人的案例

三张重要的表

一、data data1列里存的是所有联系人的信息

二、data表里面的raw_contact_id 实际上是raw_contact表的contact_id

三、data表里面的minetype_id列 实际对应的是minetype表

实现步骤

【1】先读取raw_contact表 读取contact_id字段 从而知道手机里有几条联系人信息

【2】再读取data表 根据raw_contact_id 去读取data1列 和mimetype_id

5.插入联系人

【1】先往raw_contact表 往contact_id列插入数据

【2】同步到data表 data1列存是所有联系人的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值