Content Provider 详解
几个概念:Cursor、 Content provider 、 Uri 、contentresolver
1、
Cursor : 个人理解为数据库中的一行数据,它是每行数据的集合。它是一个类。通过它的一系列方法,我们可以对数据库中的每行进行定位,我们还可以知道每一列的信息。比如:
cursor(游标).moveToFirst(),表示定位到第一行,然后我们通过其他方法可以知道每列的名称,每列的数据类型等。
2、
Content Provider :内容提供者,我们一个application中的其他类假如想操作数据库中的数据的话,就可以直接对此进行操作,而避免了对数据库进行直接操作,再说了,数据库这些个东西有权限要求的,我们不可能把数据库直接暴露出来,所以,通常采用这种形式。其实他就是一个提供数据访问的网站,我们要访问它的话,就得知道他的域名。 android:authorities . 在minifest.xml中配置如下:(包含两个部分,name 与 anthorities)
<provider android:name=".PersonProvider" android:authorities=
"com.sharpandroid.providers.personprovider"/>
当某个应用,可能是外部的,可以通过这两个属性来找到这个Content Provider了。
Content Provider 支持在多个应用中存储和读取数据。这也是跨应用共享数据的唯一方式。在android系统中,没有一个公共的内存区域,供多个应用共享存储数据。
3、
Uri: 这个东西就是 提供者提供数据的详细地址,到底是哪些数据,用此来对数据进行过滤操作。假如说,Content Provider是一个DNS,域名的话。那么Uri可以认为是IP地址,我们通过此IP地址找到我们所需要的数据。知道了它,就知道了数据在哪,然后通过调用某个方法,返回一个Cursor对象。数据包含在这个其中。
它有几个部分组成: content://com.sharpandroid.provider.personprovider/person/2
其中,scheme:content 表示这个数据被一个content类型的数据(内容提供者)所控制。
authrities: com.sharpandroid.provider.personpervider表示权限部分,就是contentprovider的域名部分。。
path:用来请求数据类型的路径。person/2 。请求的是person/2,还可以是school/student等。
ID:被请求特定记录的ID。
还有一点需要注意,需要被数据不一定来自数据库,还可以来自其他地方,比如说XML,文本等。
Uri.parse()这个方法可以将字符串解析为Uri的形式。
我们一般通过UriMather类用来对我们 我们传递过来的IP进行自动匹配。
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int PERSONS = 1;
private static final int PERSON = 2;
private DatabaseHelper databaseHelper;
static{
matcher.addURI("com.sharpandroid.providers.personprovider",
"person", PERSONS); //对特定的值进行匹配,成功返回1.
matcher.addURI("com.sharpandroid.providers.personprovider",
"person/#", PERSON);//#表示通配符,如果匹配成功,返回匹配码2.
}
4、
contentresovler:
那么我们该如何使用contentprovider呢?
我们一般通过contentresolver来对内容提供者提供的数据进行操作。
这个类提供了与Content Provider 相同的四个方法,增删改查方法。
如果需要查询contentprovider数据集的特定记录(行),还需要知道该记录的ID的值。
构建查询
查询就是输入URI等参数,其中URI是必须的,其他是可选的,如果系统能找到URI对应的contentprovider将返回一个Cursor对象。
可以通过ContentResolver.query()或者Activity.managedQuery()方法。两者的方法参数完全一样,查询过程和返回值也是相同的。
其他注意点:
query()方法,返回值是Cursor实例,用于迭代请求的数据。Cursor是一个接口。android为该接口提供了一些只读的(和 JDBC的ResultSet不一样,后者还提供可写入的可选特性)Cursor实现。比如SQLiteCursor,可迭代SQLite数据库中的数据。可以通过SQLiteDatabase类的query()方法获取到该Cursor实例。还有其他的Cursor实现,比如 MatrixCursor,用于数据不是存储在数据库的情况下。
因为Contentprovider可能被多个ContentResolver对象在不同的进程和线程中调用,因此实现Contentprovider必须考虑线程安全问题。
作为良好的习惯,在实现编辑数据的代码中,要调用ContentResolver.notifyChange()方法,通知那些监听数据变化的监听器。
在实现子类的时候,还有一些步骤可以简化Contentprovider客户端的使用:
定义public static final Uri常量,名称为CONTENT_URI:
public static final UriCONTENT_URI =
Uri.parse("content://com.example.codelab.transportationprovider");
如果有多个表,它们也是使用相同的CONTENT_URI,只是它们的路径部分不同。
也就是说红色框部分是一致的。
定义返回的列名,public static final,列名的值,比如使用SQLite数据库作为存储,对应表的列名。
在文档中要写出各个列的数据类型,便于使用者读取。
如果需要处理新的MIME数据类型,比如通过Intent的方式,并且带data的mimeType(参见总结一下Intent概念),那么需要在ContentProvider.getType()方法中进行处理,参见编写完整的Contentprovider示例编写一个getType方法部分。
如果处理数据库表中超大的数据,比如很大的位图文件,一般存在文件系统中,可以参照在contentprovider中使用大型二进制文件,这样第三方的contentprovider使用者,可以访问不属于它权限的文件,通过contentprovider做代理。
声明 Content Provider
创建ContentProvider后,需要在manifest文件中声明,android系统才能知道它,当其他应用需要调用该ContentProvider时才能创建或者调用它。
语法类似:
<providerandroid:name="com.easymorse.cp.MyContentProvider"
android:authorities="com.easymorse.cp.mycp"></provider>
android:name要写ContentProvider继承类的全名。
android:authorities要写和CONTENT_URI常量的B部分(见上面图)。
注意不要把上图C和D部分加到authorities中去。authorities是用来识别ContentProvider的,C和D部分实际上是ContentProvider内部使用的。
Content Provider 详解的更多相关文章
- Content Providers详解
今天仔细阅读了一遍Content Providers的官方API文档,总结了一下Android中Content Providers的用法. 各种类型的Content Provider对一个结构化的数据 ...
- android 四大组件详解
这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...
- AndroidMainfest详解
基于TV settings和SettingsProvider Android启动模式对activity行为的影响 AndroidManifest.xml文件详解 Manifest文件中,applica ...
- 入职小白随笔之Android四大组件——内容提供器详解(Content Provider)
Content Provider 内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间 实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的 ...
- content = "IE=edge,chrome=1" 详解
content = "IE=edge,chrome=1" 详解 < meta http-equiv = "X-UA-Compatible" content ...
- 【META http-equiv="Content-Type" Content="text/html; Charset=*】意义详解
[META http-equiv="Content-Type" Content="text/html; Charset=*]意义详解 META,网页Html语言里Head ...
- ActionBar详解
转: 一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和 ...
- Android UI组件----AppWidget控件入门详解
Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下 ...
- Android proguard 详解
本文转载于:http://blog.csdn.net/banketree/article/details/41928175 简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往 ...
随机推荐
- [uiautomator篇][8] 增加应用读取内置存储卡的权限
1 要在androidmainfest.xml增加权限(这样之后,在设备上的权限才可以点击,不然是灰色) <uses-permission android:name="android. ...
- php_strip_whitespace和trim的搭配使用
在学习kongphp框架时有这么一段代码是为了生成运行时文件的 $runfile = RUNTIME_PATH.'_runtime.php'; if(!is_file($runfile)) { $s ...
- POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28399 Accepted: 9684 De ...
- 安装环境 :win64
1.安装环境 :win64 1.1 下载mysql安装包地址: https://dev.mysql.com/downloads/file/?id=476233 2.安装 2.1 解压下载的ZIP压缩包 ...
- APIO2018 题解
坑了好久,补一补. 话说我当时去参加 $APIO2018$ 了,不过纯粹打铁…… 我的程序交道人家毛子的网站上, $c++14$ 编译器不停地给我编 $RE$,只记得好像是结构体排序的问题(删掉那个排 ...
- TroubleShoot:网站设置找不到术语管理
在SharePoint站点中找不到“术语管理”这个链接功能. 解决方案: Enable-SPFeature -id “73EF14B1-13A9-416b-A9B5-ECECA2B0604C” -Ur ...
- C语言实验报告二
实验一:第11次实验作业报告 题目:方阵循环右移 实验要求:将给定n×n方阵中的每个元素循环向右移m个位置,即将第0.1.⋯.n−1列变换为第n−m.n−m+1.⋯.n−1.0.1.⋯.n−m−1列. ...
- php validator classes
<?php /** * 验证类 */ class Validator { /* 函数名称:isNumber 简要描述:检查输入的是否为数字 输入:string 输出:boolean */ pub ...
- 31深入理解C指针之---指针和字符串
一.字符串与指针 1.定义:使用字符指针表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符指针 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用类似于数组的 ...
- unix网络编程第2章
time_wait状态 可靠地实现tcp全双工连接的终止; (假设客户端先关闭).服务端再关闭,服务端将发送fin ,客户端此时进入time_wait状态.客户端接收到fin.将回一个ack.如果这 ...