- 浏览: 321065 次
最新评论
-
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 1394一、监听ContentProvider主要步骤 1 ... -
android 使用广播接收者监听短信和拦截外拨电话
2012-06-27 23:31 2181如果你想监听自己或者别人接收到的短信,设置黑名单等功能, ... -
android 广播接收者--BroadcastReceiver
2012-06-27 23:30 3504BroadcastReceiver初识: ... -
一个项目只使用一个Activity初探
2012-06-27 23:29 934提供一个简单案例: 1,新建一个项目 修改和添加 ... -
android 之访问WebService显示手机号码归属地
2012-06-27 23:27 1426发送XML 通过URL封装路径打开一个HttpURLC ... -
Android开发从入门到精通(8) _9
2012-04-24 21:45 2422Spinner 第八章(9) 在本节中将为Spinne ... -
Android开发从入门到精通(8) _8
2012-04-24 21:44 932RadioGroup 第八章(8) 在本章中将为Rad ... -
Android开发从入门到精通(8) _7
2012-04-24 21:43 903EditText 第八章(7) 在本节中,和上一节很类 ... -
Android开发从入门到精通(8) _6
2012-04-24 21:43 837CheckBox 第八章(6) 在本节中,将为Chec ... -
Android开发从入门到精通(8) _5
2012-04-24 21:42 869按钮 第八章(5) 看看下面的代码。这段代码代表了四个 ... -
Android开发从入门到精通(8) _4
2012-04-23 22:18 1003为AutoComplete创建一个 ... -
Android开发从入门到精通(8) _3
2012-04-23 22:17 1123使用菜单 第八章(3) 在本节中,你将建造一个应用 ... -
Android开发从入门到精通(8) _2
2012-04-23 22:17 1001修改AndroidManifest.xml文件 第八章( ... -
Android开发从入门到精通(8) _1
2012-04-23 22:16 817列表,菜单和其它Views 第八章(1) 关键技能 & ... -
Android开发从入门到精通(7) _8
2012-04-23 22:16 1061试试这个:修改AndoridPhoneDialer项目 ... -
Android开发从入门到精通(7) _7
2012-04-22 15:14 930执行一个EditText View 第七章(7) ... -
Android开发从入门到精通(7) _6
2012-04-22 15:13 1118修改AndroidPhoneDialer 第七章(6) ... -
Android开发从入门到精通(7) _5
2012-04-22 15:13 895编辑活动许可 第七章(5) 大多数的Activit ... -
Android开发从入门到精通(7) _4
2012-04-22 15:12 973在本节中你将会 ... -
Android开发从入门到精通
2012-04-21 12:46 872从你的活动中打出电话 第七章(4) 在本节中你将会 ...
相关推荐
Android入门_-_数据库支持(SQLite),_内容提供器(ContentProvider).doc
《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平台的技术...
14.1.4 豆瓣网API快速入门 14.1.5 豆瓣网APIJava库介绍 14.2 豆瓣网(Web2.0)客户端设计 14.2.1 客户端功能规划设计 14.2.2 UI和交互流程设计 14.2.3 数据存储设计 14.3 豆瓣网(Web2.0)客户端实现 14.3.1 申请APIKey ...
14.1.4 豆瓣网API快速入门 14.1.5 豆瓣网APIJava库介绍 14.2 豆瓣网(Web2.0)客户端设计 14.2.1 客户端功能规划设计 14.2.2 UI和交互流程设计 14.2.3 数据存储设计 14.3 豆瓣网(Web2.0)客户端实现 14.3.1 申请APIKey ...
android入门 PPT学习 控件 ListView GridView Intent ContentProvider
14.1.4 豆瓣网api快速入门 264 14.1.5 豆瓣网api java库介绍 265 14.2 豆瓣网(web 2.0)客户端设计 268 14.2.1 客户端功能规划设计 268 14.2.2 ui和交互流程设计 268 14.2.3 数据存储设计 270 14.3...
Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还讲解了Android开发的高级技术: Camera、地图、GPS、...
41、AIDL Service android中的跨进程调用 客户端,服务端见AidlService 42、BroadcastReceiver 接收广播消息 43、非UI线程中不能操作UI线程中的View测试 44、ImageSwitcher animation gesture实现可以滑动的跑马灯...
《Android开发入门与实战》内容上涵盖了用Android开发的大部分场景,从Android基础介绍、环境搭建、SDK介绍、Market使用,到应用剖析、组件介绍、实例演示等方面。从技术实现上,讲解了5个Android平台下的完整综合...
Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还讲解了Android开发的高级技术: Camera、地图、GPS、...
第1章 快速入门 1.1 安装工具 1.1.1 Java 5.0+ 1.1.2 Eclipse 3 1.1.3 AndroidSDK启动程序软件包 1.1.4 AndroidSDK组件 1.1.5 Eclipse插件 1.2 创建第一个程序 1.3 在模拟器上运行程序 1.3.1 创建一个AVD 1.3.2 再试...
Google Android开发入门与实战的代码 1章 掀起你的盖头来——初识Android. 1 1.1 认识Android 1 1.2 Android的背景 2 1.2.1 Android的历史 2 1.2.2 Android的发展 2 1.3 我的Android我做主 2 ...
程序例子包含了2个独立的Android程序,其中一个负责提供数据并提供本地操作,另外一个可以跨进程访问提供者提供的数据。...由于没有其他多余的代码,功能针对性很强,是学习Android跨进程数据共享的入门助手。
Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还讲解了Android开发的高级技术: Camera、地图、GPS、...
Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还讲解了Android开发的高级技术: Camera、地图、GPS、...
Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还讲解了Android开发的高级技术: Camera、地图、GPS、...
Android Android Android Android 开发入门 System System System System Requirements Requirements Requirements Requirements The sections below describe the system and software requirements for developing...
Android基础教程(你的第一本Android书) 基本信息 原书名: Hello, Android: Introducing Google's Mobile Development Platform 原出版社: Pragmatic Bookshelf 作者: (美)Ed Burnette 译者: 张波 高朝勤 ...
这是我刚学android时自己写的一个例子,主要用到了Activity,ContentProvider, BroadcastReceiver三大组件,还有涉及其他知识,我认为刚学android的话挺不错的例子
1、课程采用Android Studio【以后简称as】开发,需要有java基础的同学才能看 需要设备电脑推荐 win10 + 手机推荐小米8 2、课程内容围绕着以下五点来讲 四大组件(服务、广播、ContentProvider、页面容器)基础UI...