zoukankan      html  css  js  c++  java
  • 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数据库存储

  • 相关阅读:
    javaScript系列---【js中获取元素的方式】
    javaScript系列---【js运算符类型】
    javaScript系列---【数据类型的强制转换】
    javaScript系列---【解析js基本数据类型】
    javaScript系列---【操作元素样式】
    Typora系列---【Typora常用快捷键】
    nyoj--239--月老的难题(最小点覆盖)
    nyoj--284--坦克大战(bfs模板)
    hdoj--3339--In Action(最短路+01背包)
    hdoj--2015--偶数求和(水题)
  • 原文地址:https://www.cnblogs.com/woider/p/5152591.html
Copyright © 2011-2022 走看看