Content Provider

版本

修改内容

日期

修改人

V1.0

原始版本

2013/2/25

skywang

 

 

 

 

1 URI

通用资源标志符(Universal Resource Identifier, 简称"URI")。

URI由许多部分所组成,示例及解说如下:

2 Content URIs

Content URIs就是Android遵照URI的标准,定义的一种专用的URI。Android提供了ContentUris、UriMatcher类来操作Content URIs。

2.1 Content URIs说明

Content URIs的语法如下:

content://authority/path/id

Content URIs的示例及说明如下:

content:

Content URIs前缀,它对应与标准URI的scheme。它的值为ContentResolver.SCHEME_CONTENT(即,content://)。

authority

一个唯一的标识符,Google建议使用类的全名来作为authority。外部调用者可以根据这个标识来找到它。

path

它可以用来表示我们要操作的数据,外部调用者根据这个路径信息来判断要返回什么类型的数据。这个后缀路径可以自由定义。

id

唯一的数字标识符。它表示要具体操作的数据类型中的具体某一项。

2.2 Content URIs API说明

2.3示例

参考“3.3示例

3 UriMatcher

3.1 UriMatcher介绍

UriMatcher用于匹配Uri。
用法如下:
(01)把你需要匹配Uri路径全部给注册上。
(02)注册后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹。如果匹配就返回匹配码,匹配码是注册时调用 addURI()方法传入的第三个参数;否则,返回-1(即UriMatcher.NO_MATCH)。

3.2 UriMatcher API说明

3.3 示例

package com.yarin.Android.HelloAndroid; 

import android.util.Log;
import android.app.Activity;
import android.content.ContentUris;
import android.content.UriMatcher;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Bundle; public class HelloAndroid extends Activity { private static final String TAG = "skywang-->HelloAndroid"; private static final String AUTHORITY = "com.yarin.Android.HelloAndroid";
private static final String SCHEME_CONTENT = ContentResolver.SCHEME_CONTENT + "://" ;
private static final int PEOPLE = 1;
private static final int PEOPLE_ID = 2; //NO_MATCH表示不匹配任何路径的返回码
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static
{
uriMatcher.addURI(AUTHORITY, "people", PEOPLE); //这里的#代表匹配任意数字,另外还可以用*来匹配任意文本
uriMatcher.addURI(AUTHORITY, "people/#", PEOPLE_ID);
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); Uri uri = Uri.parse(SCHEME_CONTENT+ AUTHORITY + "/people");
Uri uriAP = uri;
Log.d(TAG, "Uri=" + uri);
Log.d(TAG, "Uri.type=" + getType(uri)); uri = Uri.parse(SCHEME_CONTENT + AUTHORITY + "/people" + "/2");
Log.d(TAG, "Uri=" + uri);
Log.d(TAG, "Uri.type=" + getType(uri)); // 添加ID
uri = ContentUris.withAppendedId(uriAP, 15);
Log.d(TAG, "Uri=" + uri);
// 获取ID
long id = ContentUris.parseId(uri);
Log.d(TAG, "Uri ID: " + id);
} private String getType(Uri uri) {
int match = uriMatcher.match(uri);
switch (match)
{
case PEOPLE:
return "vnd.android.cursor.dir/person";
case PEOPLE_ID:
return "vnd.android.cursor.item/person";
default:
return null;
}
}
}

打印信息如下:

D/skywang-->HelloAndroid( 2131): Uri=content://com.yarin.Android.HelloAndroid/people

D/skywang-->HelloAndroid( 2131): Uri.type=vnd.android.cursor.dir/person

D/skywang-->HelloAndroid( 2131): Uri=content://com.yarin.Android.HelloAndroid/people/2

D/skywang-->HelloAndroid( 2131): Uri.type=vnd.android.cursor.item/person

D/skywang-->HelloAndroid( 2131): Uri=content://com.yarin.Android.HelloAndroid/people/15

D/skywang-->HelloAndroid( 2131): Uri ID: 15

4 Content Provider

4.1 Content Provider介绍

如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。

如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

ContentResolver是通过URI来查询ContentProvider中提供的数据。除了URI以外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中ID部分。

4.2 Content Provider示例

代码地址:http://pan.baidu.com/share/link?shareid=305825&uk=3993336582

说明:

代码包括两部分(继承Content Provider的类的实现 和 它对应的测试类)

第一部分源码:MyProvider/src/com/skywang/myProvider/MyProvider.java

MyProvider/src/com/skywang/myProvider/utils/Util.java

第二部分源码:MyProvider/tests/src/com/test/MyProviderTests.java

打印信息如下:

D/skywang-->MyProvider( 3016): open/create table skywang_myprovider.db

D/skywang-->MyProvider( 3016): insert uri=content://com.skywang.myProvider/table_01

D/skywang-->MyProviderTests( 3003): insert uri=content://com.skywang.myProvider/table_01/1

D/skywang-->MyProvider( 3016): insert uri=content://com.skywang.myProvider/table_01

D/skywang-->MyProviderTests( 3003): insert uri=content://com.skywang.myProvider/table_01/2

D/skywang-->MyProvider( 3016): insert uri=content://com.skywang.myProvider/table_01

D/skywang-->MyProviderTests( 3003): insert uri=content://com.skywang.myProvider/table_01/3

D/skywang-->MyProvider( 3016): insert uri=content://com.skywang.myProvider/table_01

D/skywang-->MyProviderTests( 3003): insert uri=content://com.skywang.myProvider/table_01/4

D/skywang-->MyProviderTests( 3003): print all value!

D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

D/skywang-->MyProviderTests( 3003): printAll--0--, email=Jimmy20020201@126.com, username=Jimmy, date=20020201, sex=MAIL

D/skywang-->MyProviderTests( 3003): printAll--1--, email=kate20030104@163.com, username=Kate, date=20030104, sex=FEMAIL

D/skywang-->MyProviderTests( 3003): printAll--2--, email=lilei20101124@gmail.com, username=Li Lei, date=20021124, sex=MAIL

D/skywang-->MyProviderTests( 3003): printAll--3--, email=lucy20101124@gmail.com, username=Lucy, date=20010624, sex=FEMAIL

D/skywang-->MyProvider( 3016): query ITEM_ID id=2, uri=content://com.skywang.myProvider/table_01/2

D/skywang-->MyProviderTests( 3003): querySecondItem--0--, email=kate20030104@163.com, username=Kate, date=20030104, sex=FEMAIL

D/skywang-->MyProvider( 3016): update ITEM_ID uri=content://com.skywang.myProvider/table_01/1, count=1

D/skywang-->MyProviderTests( 3003): print all value!

D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

D/skywang-->MyProviderTests( 3003): printAll--0--, email=update_email, username=update_name, date=update_date, sex=update_sex

D/skywang-->MyProviderTests( 3003): printAll--1--, email=kate20030104@163.com, username=Kate, date=20030104, sex=FEMAIL

D/skywang-->MyProviderTests( 3003): printAll--2--, email=lilei20101124@gmail.com, username=Li Lei, date=20021124, sex=MAIL

D/skywang-->MyProviderTests( 3003): printAll--3--, email=lucy20101124@gmail.com, username=Lucy, date=20010624, sex=FEMAIL

D/skywang-->MyProviderTests( 3003): delete uri=content://com.skywang.myProvider/table_01/1

D/skywang-->MyProvider( 3016): delete ITEM_ID id=1, uri=content://com.skywang.myProvider/table_01/1, count=1

D/skywang-->MyProviderTests( 3003): print all value!

D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

D/skywang-->MyProviderTests( 3003): printAll--0--, email=kate20030104@163.com, username=Kate, date=20030104, sex=FEMAIL

D/skywang-->MyProviderTests( 3003): printAll--1--, email=lilei20101124@gmail.com, username=Li Lei, date=20021124, sex=MAIL

D/skywang-->MyProviderTests( 3003): printAll--2--, email=lucy20101124@gmail.com, username=Lucy, date=20010624, sex=FEMAIL

D/skywang-->MyProvider( 3016): delete ITEM uri=content://com.skywang.myProvider/table_01, count=1

D/skywang-->MyProviderTests( 3003): print all value!

D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

D/skywang-->MyProviderTests( 3003): printAll--0--, email=lilei20101124@gmail.com, username=Li Lei, date=20021124, sex=MAIL

D/skywang-->MyProviderTests( 3003): printAll--1--, email=lucy20101124@gmail.com, username=Lucy, date=20010624, sex=FEMAIL

D/skywang-->MyProviderTests( 3003): delete all value!

D/skywang-->MyProvider( 3016): delete ITEM uri=content://com.skywang.myProvider/table_01, count=2

D/skywang-->MyProviderTests( 3003): print all value!

D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

参考文献:

1,Android API文档

2,contentprovider的学习实例总结:http://www.cnblogs.com/chenglong/articles/1892029.html

3,Android实现数据存储技术:http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html

Android 数据存储04之Content Provider的更多相关文章

  1. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  2. Android 内容提供器(Content Provider)介绍

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

  3. Android开发-API指南-创建 Content Provider

    Creating a Content Provider 英文原文:http://developer.android.com/guide/topics/providers/content-provide ...

  4. android 数据存储的四种方式.

    Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...

  5. Android数据存储:Shared Preferences

    Android数据存储之SharedPreferences 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上, Android 为数据存储提供了如下几种方式:1 ...

  6. Android数据存储的五种方法汇总

    本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 ...

  7. Android数据存储之Shared Preferences共享数据存储

    Android数据存储之Shared Preferences共享数据存储 在Android中一共提供了4种数据存储方式,但是由于存储的这些数据都是其应用程序私有的,所以如果需要在其他应用程序中使用这些 ...

  8. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  9. Android数据存储-通过SharedPreferences实现记住密码的操作

    在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...

随机推荐

  1. 基于 Apache 在本地配置多个虚拟主机

    如何使用 Apache 在本地配置出多个虚拟主机呢?而且使用不同的“域名”来访问本地不同的站点呢? 一般情况下,咱们都使用 localhost 来访问本机上的服务器,在我们的 C:/WINDOWS/s ...

  2. [原创]Sql2008 使用TVP批量插入数据

    TVP(全称 :Table-Valued Parameter) 叫做表值参数(Table-Valued Parameter)是SQL2008的一个新特性.顾名思义,表值参数表示你可以把一个表类型作为参 ...

  3. libsvm的使用

    参考:http://www.cnblogs.com/GuoJiaSheng/p/4480497.html http://www.cnblogs.com/tornadomeet/archive/2012 ...

  4. MVC 6 电商网站开发实战

    [原创] ASP.NET 5系列教程 (六): 在 MVC6 中创建 Web API 标签: Web API MVC6 创建web API | 博主:powertoolsteam     ASP.NE ...

  5. Ubuntu系统无法获得锁/var/lib/dpkg/lock - open (11: 资源暂时不可用)的解决方案

    Ubuntu系统无法获得锁/var/lib/dpkg/lock - open (11: 资源暂时不可用)的解决方案     问题 使用Ubuntu打开终端时,输入带有sudo apt-get 命令行是 ...

  6. 001.DHCP简介

    一 DHCP概念 DHCP指动态主机配置协议,是一个局域网的网络协议,使用UDP协议工作. 二 应用 为大量客户机自动分配地址,提供集中管理 减轻管理和维护成本,提高网络配置效率 三 分配的主要信息 ...

  7. 命令:tr

    参考资料:https://www.thegeekstuff.com/2012/12/linux-tr-command/ 简介 tr命令用于转换.删除或者去除重复字符.它从STDIN中读取数据并且将其写 ...

  8. EditText 数字范围 检查string 是不是数字

    public static boolean isNumeric00(String str){ try{ Integer.parseInt(str); return true; }catch(Numbe ...

  9. COJ1013 WZJ的数据结构(十三)

    WZJ的数据结构(十三) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个节点的有根树(根节点为1),每个节点有权 ...

  10. CTSC被虐记

    退役前写写破事乐呵乐呵..(雾 Day0 愉快的没有分到另一个宾馆...但是是个单间...而且居然是大床房...难以置信, 试机向BeiYe学习了一发Gedit的外部工具, 试到一般好像都走了..只剩 ...