内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前,使用内容提供器是 Android 实现跨程序共享数据的标准方式。

  不同于文件存储和 SharePreferences 存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄露的风险。

访问其他程序中的数据:

  对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,就一定要借助 ContentResolver 类,可以通过 Context 中的 getContentResolver()方法获取到该类的实例。

  ContentResolver 中提供了一系列方法用于对数据进行增删改查的操作,其中 insert() 方法用于添加数据,update()方法用于更新数据,delete()方法用于删除数据,query()方法用于查询数据,操作方式与 SQLiteDatabase 类似,只不过它们在方法参数上稍微有一些区别。

  不同于 SQLiteDatabase,ContentResolver 中的增删改查方法都是不接受表名参数的,而是使用一个URI参数代替,这个参数被称为内容 URI。内容 URI 给内容提供器中的数据建立了唯一标识符,它主要由两部分组成,权限(authority)和路径(path)。权限是用于对不同的应用程序做区分的,一般为了避免冲突,都会采用程序包名的方式来进行命名。路径则是用于对同一应用程序中不同的表做区分的,通常都会添加到权限的后面。

  例如某个程序的包名是 com.example.app,那么该程序对应的权限就可以命名为 com.example.app.provider。而该程序的数据库里存在两张表,table1和table2,这时就可以将路径分别命名为/table1和/table2,然后把权限和路径进行组合,内容 URI 就变成了 com.example.app.provider/table1 和 com.example.app.provider/table2,最后还需要在字符串的头部加上协议声明。因此,内容 URI 最标准的格式写法如下:

     content://com.example.app.provider/table1

     content://com.example.app.provider/table2

  内容 URI 可以非常清楚的表达出我们想要访问哪个程序中哪张表里的数据。也正是如此,ContentResolver 中的增删改查方法才都接收 Uri 对象作为参数。在得到内容URI字符串之后,还需要将它解析成 Uri 对象才可以作为参数传入。只需要调用 Uri.parse() 方法,就可以将内容 URI 字符串解析成 Uri 对象了。

     Uri uri = Uri.parse("content://com.example.app.provider/table1")

  现在我们就可以使用这个 Uri 对象来查询 table1 表中的数据了,代码如下所示:

     Cursor cursor = getContentResolver().query( uri , projection , selection , selectionArgs , sortOrder );

  这些参数和 SQLiteDatabase 中 query()方法里的参数很像,但总体来说要简单一些,毕竟这是在访问其他程序中的数据,没必要构建过于复杂的查询语句。

  query() 方法参数描述:

  uri:指定查询某个应用程序下的某一张表,对应 from table_name

  projection:指定查询的列名,对应 select column1,column2

  selection:指定 where 的约束条件,对应 where column = value

  selectionArgs:为 where 中的占位符提供具体的值

  orderBy:指定查询结果的排序方式,对应 order by column

  查询完成后返回的仍然是一个 Cursor 对象,这时我们就可以将数据从 Cursor 对象中逐个读取出来。读取的思路仍然是通过移动游标的位置来遍历 Cursor 的所有行,然后取出每一行相对应的数据。

  掌握了最难的查询操作,剩下的增加、修改、删除操作就更不在话下了。

总结:

  ContentResolver 中的基本操作和 SQLiteDatabase 中的操作类似,只不过 ContentResolver 不像 SQLiteDatabase 一样接收表名作为参数,而是使用内容 URI 来定位具体的程序和数据表,而内容URI是由 "content://" + 权限 + 路径 组成,通过 Uri.parser() 方法将内容 URI 字符串解析成 Uri 对象。

  如果你看的比较吃力,说明你还需要重新温习一下 SQLiteDatabase:Android 数据存储之 SQLite数据库存储

Android 内容提供器(Content Provider)介绍的更多相关文章

  1. 《第一行代码》学习笔记30-内容提供器Content Provider(3)

    1."如何在自己的程序中访问其他应用程序的数据",思路->获取到该应用程序的内容URI,再借助ContentResolver进行CRUD操作. 2.要实现跨程序共享数据-&g ...

  2. 《第一行代码》学习笔记28-内容提供器Content Provider(1)

    1.内容提供器:用于在不同的应用程序之间实现数据共享的功能,提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问 数据的安全性.使用内容提供器是Android实现跨程序共享数据 ...

  3. 《第一行代码》学习笔记29-内容提供器Content Provider(2)

    1.查询操作: if (cursor != null) { while (cusor.moveToNext()) { String column1 = cursor.getString(cursor. ...

  4. android: 内容提供器简介

    我们学了 Android 数据持久化的技术,包括文件存储.SharedPreferences 存 储.以及数据库存储.不知道你有没有发现,使用这些持久化技术所保存的数据都只能在当 前应用程序中访问.虽 ...

  5. Android内容提供者(Content provider)

    使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访 ...

  6. android第一行代码-9.内容提供器

    内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能, 内容提供器包括两部分:使用现有的内容提供器来读取和操作相应程序中的数据跟创建自己的内容提供器给我们程序的 ...

  7. Android应用安全之Content Provider安全

    android平台提供了Content Provider,将一个应用程序的指定数据集提供给其它应用程序.这些数据可以存储在文件系统.SQLite数据库中,或以任何其它合理的方式存储.其他应用可以通过C ...

  8. Android学习之基础知识十—内容提供器(Content Provider)

    一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...

  9. 入职小白随笔之Android四大组件——内容提供器详解(Content Provider)

    Content Provider 内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间 实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的 ...

随机推荐

  1. Webpack 之 Loader 的使用

    安装 loaders 如果loader在npm里,可以这样安装: $ npm install xxx-loader --save 或者 $ npm install xxx-loader --save- ...

  2. thinkphp连接数据库

    版本:3.1.1 连接数据库的具体位置 thinkphp/Config/convention.php,默认修改数据库在这里就可以了 但是为了方便,把数据库配置写到Index/Conf/config.p ...

  3. ecshop自动退出

    在使用ecshop后台的时候,老是自动退出,影响正常使用. 解决办法: 在includes/cls_session.php中,function gen_session_key($session_id) ...

  4. LaTeX 页眉页脚的设置

    Latex中页眉页脚的设置 1. 首先要加页眉页脚的话,需要启动宏: 我通常用fancyhdr宏包来设置页眉和页脚. \usepackage{fancyhdr} 我们在 LaTeX 中先把 page ...

  5. log4j2 使用

    转载自 Blog of 天外的星星: http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html Log4j 2的好处就不和大家说了,如果你搜了2,说明你 ...

  6. Python socket编程

    一.什么是socket: socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求 ...

  7. vim 创建和管理折叠

    参考文章: http://blog.csdn.net/bendanban/article/details/7743530 首先要有折叠, 然后才能说, 打开和关闭 折叠; 打开: zo: zip op ...

  8. Vim 的 tab 设置

    文章转自:http://blog.csdn.net/shell_picker/article/details/6033023 摘自 Vim 手册: 选项:1. tabstop:表示一个 tab 显示出 ...

  9. Dirty Markup - 在线代码美化工具

    如果你需要一个帮助你规整书写混乱的代码的工具的话,我强烈推荐给你这个在线代码美化工具 - Dirty Markup.这个在线工具能够帮助你有效的处理HTML/HTML5,CSS和javascript代 ...

  10. 让ie浏览器支持html5新标签的解决方法(使用html5shiv)

    没估计错的话旧版浏览器都是不识别这些新增的标签所以都是用行内元素来处理解决的,所以,有一个解决办法的突破口就是让它变成块状元素就不会处于同一行了,这样在新旧浏览器都是可以显示同样的效果,再者就是让浏览 ...