- 浏览: 339989 次
最新评论
-
ax003d:
你好,我使用这种方法,在gridview里显示图片,当图片数量 ...
ScrollView嵌套GridView、ListView的解决办法 -
yunzhu:
Firefox下有Xmarks书签同步插件,很好用,可以方便地 ...
开发人员应该具备的工具----欲善其事,先利其器 -
mjlixm:
Android入门:ContentProvider 学习了! ...
Android入门:ContentProvider -
bluesky329:
很好收益匪浅!
一个软件工程师的经验之谈 -
qinglongyun:
每天工作4小时的程序员
一、ContentProvider介绍
ContentProvider翻译为“内容提供者”;
定义:指该应用包含一些方法,供外界访问,其他应用程序可以调用该方法,比如如果应用A创建了一个数据库“test.db”,默认是私有的,即其他应用程序不能对其进行操作,但是如果应用A使用了ContentProvider,则其他应用程序可以访问该数据库;
用途:某个应用对外共享数据;
注意点:和Activity一样,都是Android 的Component之一,如果要创建,则需要在AndroidManifest.xml中设置;
好处:提供了统一的insert,update,delete,query方法,操作任何数据;
二、URI介绍
URI:类似于我们以前使用的URI,但是此处URI的目的是为了能够根据URI以及调用的方法来决定怎样操作数据,比如:
uri="..../person",调用insert方法,则表示需要插入一条person记录;
ContentProvider中使用的URI注意点:
(1)以 content:// 开头;
(2)模式为:content://authorities/path;其中authorities类似于域名或IP,用来标识操作哪个ContentProvider,path表示具体的操作;
举例:
content://org.xiazdong.providers.personprovider/person 表示调用“org.xiazdong.providers.personprovider”的方法,操作person数据;
补充:ContentUris辅助类
URI uri = ContentUris.withAppendId(URI param,int id); //为某个URI添加一个ID
比如param = "content://authorities/person",id=10,则uri = "content://authorities/person/10";
long id = ContentUris.parseId(URI uri); //提取URI中最后的ID
比如uri = "content://authorities/person/10",则返回的id=10;
三、ContentProvider开发步骤简要说明
1.创建一个类,并继承ContentProvider,比如PersonProvider;
2.在AndroidManifest.xml中设置:
<provider android:name=".PersonProvider" android:authorities="org.xiazdong.provides.personprovider"/>
3.定义UriMatcher,
private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); //创建一个URI匹配器,参数为不匹配时的返回值
在onCreate中使用matcher.addURI("authorities","path",code); //加入匹配的URI,如果匹配,则matcher.match(uri)返回code;
如果要匹配:content://authorities/path/数字 ,则matcher.addURI("authorites","path/#",code);
4.重写:
onCreate():用于为操作数据做准备;
insert:插入数据,返回插入的记录所代表的URI;
update:更新数据,返回操作影响的记录行数;
delete:删除数据,返回操作影响的记录行数;
query:查询数据,返回Cursor;
getType:记录的类型,如果操作集合,则必须以vnd.android.cursor.dir开头,如果操作非集合,则必须以vnd.android.cursor.item开头,比如vnd.android.cursor.dir/person
5.外部调用:
ContentResolver resolver = this.getContext().getContentResolver();
resolver.insert();
resolver.update();
resolver.delete();
resolver.query();
四、应用实例
AndroidManifest.xml
- <provider
- android:name=".PersonProvider"
- android:authorities="org.xiazdong.provides.personprovider"
- ></provider>
PersonProvider.java
- package org.xiazdong.db;
- import android.content.ContentProvider;
- import android.content.ContentUris;
- import android.content.ContentValues;
- import android.content.UriMatcher;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.net.Uri;
- public class PersonProvider extends ContentProvider{
- private DatabaseHelper helper;
- private SQLiteDatabase db;
- private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
- @Override
- public boolean onCreate() {
- helper = new DatabaseHelper(this.getContext());
- //匹配:content://org.xiazdong.provides.personprovider/person,返回值为1
- matcher.addURI("org.xiazdong.provides.personprovider", "person", 1);
- //匹配:content://org.xiazdong.provides.personprovider/person/数字,返回值为2
- matcher.addURI("org.xiazdong.provides.personprovider", "person/#", 2);
- return true;
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- db = helper.getWritableDatabase();
- switch(matcher.match(uri)){
- case 1: //查询所有记录
- return db.query("person", projection, selection, selectionArgs, null, null, null);
- case 2://查询特定记录
- long id = ContentUris.parseId(uri);
- String where = "id="+id;
- if(selection!=null&&!"".equals(selection)){ //因为selection可能还包含其他的where语句,需要再加上 "and id=?"
- where = where + " and "+selection;
- }
- return db.query("person", projection, where, selectionArgs, null, null, null);
- default:
- throw new IllegalArgumentException("wrong uri");
- }
- }
- /*
- * 如果操作集合,则必须以vnd.android.cursor.dir开头
- * 如果操作非集合,则必须以vnd.android.cursor.item开头
- * */
- @Override
- public String getType(Uri uri) {
- switch(matcher.match(uri)){
- case 1:
- return "vnd.android.cursor.dir/person";
- case 2:
- return "vnd.android.cursor.item/person";
- }
- }
- /*
- * values为插入的数据
- * 返回:插入的数据所代表的URI
- * */
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- db = helper.getWritableDatabase();
- switch(matcher.match(uri)){
- case 1:
- long rowid = db.insert("person", null, values);
- return ContentUris.withAppendedId(uri, rowid); //返回插入的记录所代表的URI
- default:
- throw new IllegalArgumentException("wrong uri");
- }
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- db = helper.getWritableDatabase();
- switch(matcher.match(uri)){
- case 1:return db.delete("person", selection, selectionArgs);
- case 2: //删除特定id记录
- long id = ContentUris.parseId(uri);
- String where = "id="+id;
- if(selection!=null&&!"".equals(selection)){
- where += " and "+selection;
- }
- return db.delete("person", where, selectionArgs);
- default:
- throw new IllegalArgumentException("wrong uri");
- }
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- db = helper.getWritableDatabase();
- switch(matcher.match(uri)){
- case 1:return db.update("person", values, selection, selectionArgs);
- case 2: //更新特定id记录
- long id = ContentUris.parseId(uri);
- String where = "id="+id;
- if(selection!=null&&!"".equals(selection)){
- where += " and "+selection;
- }
- return db.update("person", values,where, selectionArgs);
- default:
- throw new IllegalArgumentException("wrong uri");
- }
- }
- }
以下我们创建一个测试类:
ContentProviderTest.java
- package org.xiazdong.db.test;
- import org.xiazdong.db.domain.Person;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.net.Uri;
- import android.test.AndroidTestCase;
- import android.util.Log;
- public class ContentProviderTest extends AndroidTestCase{
- public void testInsert()throws Exception{ //插入"name=yyy,age=100"的记录
- Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person");
- ContentResolver resolver = this.getContext().getContentResolver();
- ContentValues values = new ContentValues();
- values.put("name", "yyy");
- values.put("age", 100);
- resolver.insert(uri, values);
- }
- public void testUpdate()throws Exception{ //更新id=5的记录为name=yyy,age=100
- Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person/5");
- ContentResolver resolver = this.getContext().getContentResolver();
- ContentValues values = new ContentValues();
- values.put("name", "yyy");
- values.put("age", 100);
- resolver.update(uri, values, null, null);
- }
- public void testDelete()throws Exception{ //删除id=11的记录
- Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person/5"); //删除id=11的记录
- ContentResolver resolver = this.getContext().getContentResolver();
- resolver.delete(uri, null, null);
- }
- public void testQuery()throws Exception{ //插入全部记录并显示
- Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person"); //查询所有记录
- ContentResolver resolver = this.getContext().getContentResolver();
- Cursor cursor = resolver.query(uri, null, null, null, null);
- while(cursor.moveToNext()){
- Person person = new Person(cursor.getInt(cursor.getColumnIndex("id")),cursor.getString(cursor.getColumnIndex("name")),cursor.getInt(cursor.getColumnIndex("age")));
- Log.v("ContentProvider", person.toString());
- }
- }
- }
发表评论
-
Android入门:监听ContentProvider数据改变
2012-07-02 00:06 1449一、监听ContentProvider主要步骤 1 ... -
android 使用广播接收者监听短信和拦截外拨电话
2012-06-27 23:31 2226如果你想监听自己或者别人接收到的短信,设置黑名单等功能, ... -
android 广播接收者--BroadcastReceiver
2012-06-27 23:30 3585BroadcastReceiver初识: ... -
一个项目只使用一个Activity初探
2012-06-27 23:29 1019提供一个简单案例: 1,新建一个项目 修改和添加 ... -
android 之访问WebService显示手机号码归属地
2012-06-27 23:27 1521发送XML 通过URL封装路径打开一个HttpURLC ... -
Android开发从入门到精通(8) _9
2012-04-24 21:45 2513Spinner 第八章(9) 在本节中将为Spinne ... -
Android开发从入门到精通(8) _8
2012-04-24 21:44 1028RadioGroup 第八章(8) 在本章中将为Rad ... -
Android开发从入门到精通(8) _7
2012-04-24 21:43 1029EditText 第八章(7) 在本节中,和上一节很类 ... -
Android开发从入门到精通(8) _6
2012-04-24 21:43 886CheckBox 第八章(6) 在本节中,将为Chec ... -
Android开发从入门到精通(8) _5
2012-04-24 21:42 911按钮 第八章(5) 看看下面的代码。这段代码代表了四个 ... -
Android开发从入门到精通(8) _4
2012-04-23 22:18 1122为AutoComplete创建一个 ... -
Android开发从入门到精通(8) _3
2012-04-23 22:17 1228使用菜单 第八章(3) 在本节中,你将建造一个应用 ... -
Android开发从入门到精通(8) _2
2012-04-23 22:17 1141修改AndroidManifest.xml文件 第八章( ... -
Android开发从入门到精通(8) _1
2012-04-23 22:16 929列表,菜单和其它Views 第八章(1) 关键技能 & ... -
Android开发从入门到精通(7) _8
2012-04-23 22:16 1125试试这个:修改AndoridPhoneDialer项目 ... -
Android开发从入门到精通(7) _7
2012-04-22 15:14 1044执行一个EditText View 第七章(7) ... -
Android开发从入门到精通(7) _6
2012-04-22 15:13 1180修改AndroidPhoneDialer 第七章(6) ... -
Android开发从入门到精通(7) _5
2012-04-22 15:13 938编辑活动许可 第七章(5) 大多数的Activit ... -
Android开发从入门到精通(7) _4
2012-04-22 15:12 1033在本节中你将会 ... -
Android开发从入门到精通
2012-04-21 12:46 914从你的活动中打出电话 第七章(4) 在本节中你将会 ...
相关推荐
### Android入门到精通详解知识点概览 #### 第一篇:Android系统结构和SDK使用 ##### 第1章:Android的系统介绍 - **系统介绍**:Android是Google开发的一款基于Linux平台的开源操作系统,专为移动设备设计。它...
### Android 入门知识点总结 #### 一、Android 平台概述 自2007年Android平台发布以来,经过多次版本更新与迭代,已经发展成为全球最受欢迎的移动操作系统之一。早期版本如2.3等已被后来更高版本所取代。随着技术...
《Android入门到精通》这本书是为想要学习和掌握Android应用开发的初学者量身打造的指南。Android作为全球最流行的移动操作系统,拥有庞大的用户群体,为开发者提供了广阔的应用市场和无限的创新空间。本书旨在帮助...
4. ContentProvider:ContentProvider是数据存储和共享的桥梁,允许应用之间共享数据,如联系人、日历等。 四、Intent和激活组件 Intent是Android中连接组件的桥梁,它用来启动Activity或Service,或者在组件间传递...
在Android开发领域,掌握基本的UI控件是入门的关键。以下是一些常见的Android控件及其用法,这些知识对于初学者来说是必不可少的。 1. TextView:TextView 是用来显示文本的控件,常用于显示标题、说明等。在XML...
《Android从入门到精通》 第1章 初识Android 1.1 什么是Android 1.1.1 移动信息设备分类 1.1.2 Open Handset Alliance和 Android 1.2 Android简介 1.2.1 Andriod的历史 1.2.2 Andriod的未来 1.2.3 Andriod平台的技术...
5. **ContentProvider**:共享和访问数据的接口,允许不同应用之间交换数据。 AndroidManifest.xml文件是每个应用的重要组成部分,它包含了应用的元数据,如所需的权限、使用的库、声明的活动和服务等。例如,清单1...
这份名为“Android入门到精通详解 (带目录)”的资料全面涵盖了Android开发的基础到高级技术,旨在帮助初学者逐步建立起扎实的技术体系。 首先,从入门阶段开始,你将学习到Android开发环境的搭建,包括安装Java ...
《Android入门学习资料详解》 Android作为全球最受欢迎的智能手机操作系统之一,吸引着众多开发者投入其怀抱。本套学习资料旨在帮助初学者快速掌握Android开发的基本技能,内容涵盖Android开发中文文档以及一系列由...
### Android入门:数据库支持(SQLite)与内容提供器(ContentProvider) #### 一、SQLite数据库支持 **1.1 概述** 在Android开发过程中,SQLite是应用最为广泛的轻量级数据库解决方案之一。它是一个内嵌式的数据库,...
【Android入门PPT大全】是一套专为初学者设计的教育资源,旨在帮助新手快速掌握Android应用开发的基础知识。这套PPT教程涵盖了从Android系统的基本架构到应用程序开发的各个环节,是学习Android开发的理想起点。 ...
一个Android应用由多个组件构成,如Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)和ContentProvider(内容提供者)。理解这些组件的职责和相互作用是Android开发的基础。 五、布局设计 使用...
Android入门中文文档是一份专为初学者设计的指南,旨在帮助新接触Android开发的朋友们快速理解和掌握这个全球最大的智能手机操作系统的基础知识。这份文档通常包含了从安装开发环境到编写第一个应用程序的所有步骤,...
1. **Android基础知识**:入门书籍通常会从基础开始,介绍Android操作系统的基本概念,包括Android系统架构、应用程序组件(Activity、Service、BroadcastReceiver、ContentProvider)以及Intent的作用。理解这些...
"Android入门精通示例源码"是一个非常适合初学者及进阶者的学习资源,它包含了从基础到高级的各种示例,帮助开发者逐步熟悉并掌握Android应用程序开发的核心技能。 首先,我们要了解Android的基本架构。Android系统...
2. **基本架构**:Android应用基于组件模型,主要包括四大组件:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供者)。学习如何在代码中创建和管理这些组件至关...
### Android程序员入门(中文版) #### 一、什么是Android? - **定义与历史**:Android是一种基于Linux内核的操作系统,最初由Andy Rubin等人于2003年创立的Android公司开发,旨在为手持设备提供一种开放源码的平台...
你可能需要学习如何读写本地文件、使用SQLite数据库存储数据,或者调用Android的ContentProvider访问外部存储。 通知和服务(Service)也是Android开发的重要部分。案例可能包含创建通知和后台运行的服务,让你理解...
在Android开发领域,"android入门、增删改查"是一个非常基础且重要的主题,它涵盖了Android应用程序开发的基本操作,特别是涉及到数据管理的核心部分。在这个主题中,开发者将学习如何创建用户界面,处理用户输入,...
8. 数据存储操作:讲解了Android中的多种数据存储方式,包括SharedPreferences、文件存储、SQLite数据库和ContentProvider,以及如何进行网络数据的处理。 9. Intent和Broadcast:深入讨论了Intent作为Android应用...