内容提供者 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列存是所有联系人的数据