Content Provider

跨进程共享数据的标准方式

与SharedPreferences存储中的全局可读可写操作模式不同的是,Content Provider可选择只对某一部分数据进行共享,从而保证数据的安全性

ContentResolver

不同于SQLiteDatabase,ContentResolver中的增删改查方法均不接收表名参数,而是使用一个Uri的参数代替,这个参数被称作内容URI
内容URI:内容提供者中的数据的唯一标识符,由两部分组成:authority和path
authority:给不同应用程序做区分,为避免冲突,采用包名命名
path:给同一应用程序中不同表做区分,通常都会添加到authority后面

内容URI标准格式:content://包名/表名
只访问某表中指定id的数据:content://包名/表名/id
匹配任意表的内容:content://包名/*
匹配指定表的任意一行数据:content://包名/表名/#
*:表示匹配任意长度的任意字符
#:表示匹配任意长度的任意数字

获取Uri实例:Uri uri = new Uri.parse(内容URI); ****

//获取实例
ContentResolver resolver = Context.getContentResolver()
//增
Uri insert(Uri url, ContentValues values)
//删
int delete(Uri url, String where, String[] selectionArgs)
//改
int update(Uri uri, ContentValues values, String where, String[] selectionArgs)
//查
Cursor query(Uri uri, String[] projection, Bundle queryArgs,CancellationSignal cancellationSignal)

基础使用

ContentProvider的创建

public class DatabaseProvider extends ContentProvider {public static final int BOOK_DIR = 0;public static final int BOOK_ITEM = 1;public static final String authority = "com.example.provider";private static UriMatcher uriMatcher;private MyDatabaseHelper dbHelper; //内容提供器数据库支持static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(authority, "book", BOOK_DIR);uriMatcher.addURI(authority, "book/#", BOOK_ITEM);}@Overridepublic boolean onCreate() {//创建内容提供器要使用的数据库dbHelper = new MyDatabaseHelper(getContext(), "BookStore.db", null, 2);//必须返回true,否则内容提供器无法被使用return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = null;switch (uriMatcher.match(uri)) {case BOOK_DIR:cursor = db.query("Book", projection, selection, selectionArgs,null, null, sortOrder);break;case BOOK_ITEM:String bookId = uri.getPathSegments().get(1);cursor = db.query("Book", projection, "id = ?", new String[]{ bookId }, null, null, sortOrder);break;}return cursor;}@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = dbHelper.getWritableDatabase();Uri uriReturn = null;long newBookId = db.insert("Book", null, values);switch (uriMatcher.match(uri)) {case BOOK_DIR:uriReturn = Uri.parse("content://" + authority + "/book/" +newBookId);break;case BOOK_ITEM:uriReturn = Uri.parse("content://" + authority + "/book/" +newBookId);break;}return uriReturn;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {SQLiteDatabase db = dbHelper.getWritableDatabase();int updatedRows = 0;switch (uriMatcher.match(uri)) {case BOOK_DIR:updatedRows = db.update("Book", values, selection, selectionArgs);break;case BOOK_ITEM:String bookId = uri.getPathSegments().get(1);updatedRows = db.update("Book", values, "id = ?", new String[]{ bookId });break;}return updatedRows;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = dbHelper.getWritableDatabase();int deletedRows = 0;switch (uriMatcher.match(uri)) {case BOOK_DIR:deletedRows = db.delete("Book", selection, selectionArgs);break;case BOOK_ITEM:String bookId = uri.getPathSegments().get(1);deletedRows = db.delete("Book", "id = ?", new String[] { bookId });break;}return deletedRows;}@Override//Uri对象所对应的MIME类型//必须以vnd开头//如内容URI以路径结尾,后接android.cursor.dir/;如以id结尾,后接android.cursor.item///最后接vnd.[authority].[path]public String getType(Uri uri) {switch (uriMatcher.match(uri)) {case BOOK_DIR:return "vnd.android.cursor.dir/vnd." + authority + ".book";case BOOK_ITEM:return "vnd.android.cursor.item/vnd." + authority + ".book";}return null;}
}

ContentProvider的访问

public void insert(View view) {  // 得到内容提供者的解析器ContentResolver resolver = getContentResolver(); //获得内容提供者的uri,注意uri格式Uri uri = Uri.parse("content://com.example.provider/book");//创建ContentValues对象,目的是创建一个空的set集合,用于存储数据ContentValues values = new ContentValues();                values.put("name", "zhangsan");                         values.put("money", 10000);// 通过内容解析器让内容提供者添加一条数据resolver.insert(uri, values);        //注册内容观察者 resolver.registerContentObserver(uri, true, new ContentObserver(new Handler()) {      @Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);}});
}

Android组件系列——Content Provider相关推荐

  1. Android四大组件之Content Provider

    Android四大组件之Content Provider 作者:白璐 日期:2020/2/24 文章目录 Android四大组件之Content Provider 概述 内容提供器(Content P ...

  2. android contentprovider api,Content Provider Basics

    一个内容提供者访问数据的中央资源库.提供者是应用程序的一部分,提供自己的操作数据的UI.然而,内容提供者主要是被其他应用程序引用,通过提供者客户对象访问提供者.提供者和提供者客户端为数据提供一个一致的 ...

  3. Android组件系列----BroadcastReceiver广播接收器

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. Android组件系列----ContentProvider内容提供者 和 android:authorities

    authorities 是provider所在的包的名字+provider本身定义的名称 ---zgs [正文] 一.ContentProvider简介: ContentProvider内容提供者(四 ...

  5. Android 组件系列-----Activity的传值和回传值

    在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...

  6. Android 组件系列-----Activity初步

    在上篇博文讲解了Android的Activity这个组件的启动流程后,接下来我们就来看看我们的Activity与我们的布局文件的关系吧 我们先来看看一个最简单的布局文件的内容: <Relativ ...

  7. Android 组件系列-----Activity生命周期

    本篇随笔将会深入学习Activity,包括如何定义多个Activity,并设置为默认的Activity.如何从一个Activity跳转到另一个Activity,还有就是详细分析Activity的生命周 ...

  8. Android组件系列----Activity的生命周期

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  9. Android组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

最新文章

  1. Wamp与IIS同时在Windows7下运行解决方法
  2. Zookeeper 在Hadoop中的应用
  3. Debian 9/10快速开启Google BBR的方法,实现TCP高效单边加速
  4. 安装rational rose
  5. 动软Model 模板 生成可空类型字段
  6. Angular4.0.0正式发布,附新特性及升级指南
  7. 自然语言处理-LDA主题模型
  8. 计算机院校人气排名,2019高校人气排行榜_最具人气大学排行榜7月榜单发布 清华大学排第一...
  9. 数据结构之选择排序:直接选择排序
  10. esp8266时钟_ESP8266(Non-OS SDK) 驱动 waveshare 2.9 寸墨水屏(二)- 程序移植、修改与测试
  11. mysql获取分组后每组的最大值
  12. promise用法_JavaScript中的async/await的用法和理解
  13. Atitit 健康减肥与软件健康减肥的总结 attilax著 1. 几大最佳实践减肥行为 1 1.1. 控制饮食分量用小碗 小盘子 小餐具 1 1.2. 软件如何减肥,控制资源占有率,比如体积 打包
  14. python ichat使用学习记录
  15. matlab变压器 变比,变压器的变比主要取决于 。
  16. Nacos 注册中心的设计原理详解
  17. This is probably not a problem with npm. There is likely additional logging output above.
  18. 关于Fatal NI connect error 12170
  19. 空间中球坐标与直角坐标的互化(matlab实现)
  20. return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replacing columns cSerDe may be incompati

热门文章

  1. 关闭工单时报错 订单 XXXX 的未处理将来更改记录阻止删除标记/完成
  2. VirtualBox错误:VERR_NEM_VM_CREATE_FAILED: What do I do?
  3. 使用免费引流脚本,如何突破引流难的困境
  4. Advanced Installer 制作带升级功能的安装包
  5. winform 使用chart控件画圆环图
  6. ubuntu系统声音_Ubuntu Linux系统提示声音设置
  7. md5 java 实现_MD5加密的Java实现
  8. 组态王与网络mysql数据库通过ODBC连接
  9. 如何用Axure做好看的页面设计
  10. 所见即所得的开源Flex设计工具:flexible