Android 内容提供器(Content Provider)介绍
内容提供器(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)介绍的更多相关文章
- 《第一行代码》学习笔记30-内容提供器Content Provider(3)
1."如何在自己的程序中访问其他应用程序的数据",思路->获取到该应用程序的内容URI,再借助ContentResolver进行CRUD操作. 2.要实现跨程序共享数据-&g ...
- 《第一行代码》学习笔记28-内容提供器Content Provider(1)
1.内容提供器:用于在不同的应用程序之间实现数据共享的功能,提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问 数据的安全性.使用内容提供器是Android实现跨程序共享数据 ...
- 《第一行代码》学习笔记29-内容提供器Content Provider(2)
1.查询操作: if (cursor != null) { while (cusor.moveToNext()) { String column1 = cursor.getString(cursor. ...
- android: 内容提供器简介
我们学了 Android 数据持久化的技术,包括文件存储.SharedPreferences 存 储.以及数据库存储.不知道你有没有发现,使用这些持久化技术所保存的数据都只能在当 前应用程序中访问.虽 ...
- Android内容提供者(Content provider)
使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访 ...
- android第一行代码-9.内容提供器
内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能, 内容提供器包括两部分:使用现有的内容提供器来读取和操作相应程序中的数据跟创建自己的内容提供器给我们程序的 ...
- Android应用安全之Content Provider安全
android平台提供了Content Provider,将一个应用程序的指定数据集提供给其它应用程序.这些数据可以存储在文件系统.SQLite数据库中,或以任何其它合理的方式存储.其他应用可以通过C ...
- Android学习之基础知识十—内容提供器(Content Provider)
一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...
- 入职小白随笔之Android四大组件——内容提供器详解(Content Provider)
Content Provider 内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间 实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的 ...
随机推荐
- Maven入门学习,安装及创建项目
一.maven介绍: 1.maven是一个基于项目对象模型(POM Project Object Model),通过配置文件管理项目的工具(项目管理工具). 2.maven主要功能:发布项目(从编译到 ...
- C#读取Excel,DataTable取值为空的解决办法
连接字符串这么些就行了 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + opnFileName ...
- python 函数基础介绍
函数是对程序逻辑进行结构化或过程化的一种编程方法.能将整块代码巧妙地隔离成易于管理的小块,把重复代码放在函数中而不是进行大量的拷贝. 一.函数创建 def 函数创建格式如下: def function ...
- js 字符串分割成字符串数组 遍历数组插入指定DOM里 原生JS效果
使用的TP3.2 JS字符串分割成字符串数组 var images='{$content.pictureurl} ' ;结构是这样 attachment/picture/uploadify/20141 ...
- safari 回调中window.open无法执行
safari无法在callback中执行window.open,其安全机制将其阻挡了. 解决方法: var oWinRef = win.open('','_blank','参数');fCallback ...
- MYSQL调优
4核8G内存配置文件 explain SQL 查看SQL索引使用情况. my.cnf skip-external-locking skip-name-resolve back_log= key_buf ...
- Promise 异步(asynchronous )编程
概述 Promise.all(iterable) 方法返回一个promise,该promise会等iterable参数内的所有promise都被resolve后被resolve,或以第一个promis ...
- hdu4950 Monster (水题)
4950 Monster Monster Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 来聊聊apply和call
今天在群里讨论的时候,看到有人问apply怎么使用,突然想起自己刚接触这个方法的时候,也是一样的摸不着头脑. 记得当时上网看了很多讲解,可实际用的时候还是感觉有些蒙蒙哒orz.... 后来想一想,也许 ...
- Excel 使用宏批量修改单元格内指定文字为红字
-> step 1:新建宏,进入编辑,使用如下代码: Sub Ss()Dim c As RangeFor Each c In ActiveSheet.UsedRange i = 1 While ...