几个概念: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 详解的更多相关文章

  1. Content Providers详解

    今天仔细阅读了一遍Content Providers的官方API文档,总结了一下Android中Content Providers的用法. 各种类型的Content Provider对一个结构化的数据 ...

  2. android 四大组件详解

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...

  3. AndroidMainfest详解

    基于TV settings和SettingsProvider Android启动模式对activity行为的影响 AndroidManifest.xml文件详解 Manifest文件中,applica ...

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

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

  5. content = "IE=edge,chrome=1" 详解

    content = "IE=edge,chrome=1" 详解 < meta http-equiv = "X-UA-Compatible" content ...

  6. 【META http-equiv="Content-Type" Content="text/html; Charset=*】意义详解

    [META http-equiv="Content-Type" Content="text/html; Charset=*]意义详解 META,网页Html语言里Head ...

  7. ActionBar详解

    转: 一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和 ...

  8. Android UI组件----AppWidget控件入门详解

    Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下 ...

  9. Android proguard 详解

    本文转载于:http://blog.csdn.net/banketree/article/details/41928175 简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往 ...

随机推荐

  1. wordpress 使用wp_head()函数

    wp_head()的作用: 在WordPress主题中使用此函数控制<head>…</head>之间的标签内容. 以通过header.php模板文件输出html中的head标签 ...

  2. install chrome on ubuntu14.04

    summary chrome broswer can't found in ubuntu14.04 default source list.To install chrome ,you must ad ...

  3. Jeddict目前的使用现状

    一.为什么使用jeddict 工具:提升生产力的工具:创建并部署一个CRUD服务系统,只需要5-10分钟 规范:生成的代码,都是稳定可执行代码(前端自动使用selenium框架测试,后端使用Arqui ...

  4. hibernate延迟加载之get和load的区别

    在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法,然后其实这两种方法在获得一个实体对 ...

  5. Welcome-to-Swift-17自判断链接(Optional Chaining)

    自判断链接(Optional Chaining)是一种可以请求和调用属性.方法及子脚本的过程,它的自判断性体现于请求或调用的目标当前可能为空(nil).如果自判断的目标有值,那么调用就会成功:相反,如 ...

  6. 【Luogu】P1472奶牛家谱(DP)

    题目链接 这是一道考思维的好题. 一开始设f[i][j]是i个点刚好j层的方案数,死活调不出来,看题解发现可以改为<=j层的方案数,最后输出f[n][m]-f[n][m-1]就好了. 对于计算考 ...

  7. NOJ——1656搬砖(DP)

    [1656] 搬砖 时间限制: 2000 ms 内存限制: 65535 K 问题描述 开学了,万恶的大二学长们又要领着大一的鲜肉们一起敲代码搬砖了,这不,著名的杨神拿着n块砖头,当然他把这n块砖头的重 ...

  8. 学习 WebService 第四步:利用WSDL(URL)生成WebService客户端<初级>

    我用的是最简单的方法,利用jdk的命令wsimport -keep -p 包路径 -d 代码存放位置 WSDL网址 蓝色是命令,粉色是存放位置,橘色是URL C:\Program Files\IBM\ ...

  9. [NOIP2017] 时间复杂度 (模拟,栈)

    题目链接 Solution 用栈进行模拟. 记录一个 \(map\) 来看循环变量有没有用过. 对于每一次入栈都加信息. 出栈直接将 \(top\) 减一下. 反正一堆乱七八糟的东西瞎搞... 注意条 ...

  10. Linux System Programming 学习笔记(十) 信号

    1. 信号是软中断,提供处理异步事件的机制 异步事件可以是来源于系统外部(例如用户输入Ctrl-C)也可以来源于系统内(例如除0)   内核使用以下三种方法之一来处理信号: (1) 忽略该信号.SIG ...