Android开发之浅谈内容提供者provider的使用

大家新年好。博主刚回到广州就要各种忙。博主换了份工作,所以昨天一来到广州就忙着找房子,好在昨晚就已经搞定。时间比较紧迫,这篇文章就直接将如何使用provider了。

内容提供者一般用于进程之间通信,当一个app需要访问另外一个app的数据库内容的时候,就需要用到内容提供者。为了节约时间,博主直接偷懒上代码了,直接拿博主之前写过的一个短信项目来上了。

首先,定义一个内容提供者

package com.freedom.intelligencesms.provider;

import com.freedom.intelligencesms.db.GroupOpenHelper;
import com.freedom.intelligencesms.utils.SmsUtils;

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;
import android.text.TextUtils;

public class GroupContentProvider extends ContentProvider {
	//授权地址
	private static final String AUTHORITY = "com.freedom.intelligencesms.provider.GroupContentProvider";
	private static final int GROUPS_INSERT = 0;
	private static final int GROUPS_QUERY_ALL = 1;
	private static final int GROUPS_UPDATE = 2;
	private static final int THREAD_GROUP_INSERT = 3;
	private static final int THREAD_GROUP_QUERY_ALL = 4;
	private static final int THREAD_GROUP_QUERY = 5;
	private static final int GROUPS_DELETE = 6;
	private static UriMatcher uriMatcher;
	private GroupOpenHelper mOpenHelper;
	private final String GROUPS_TABLE = "groups";
	private final String THREAD_GROUP_TABLE = "thread_group";

	static {
		//定义一个匹配器
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

		// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/insert
		uriMatcher.addURI(AUTHORITY, "groups/insert", GROUPS_INSERT);

		// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/
		uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL);

		// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/update
		uriMatcher.addURI(AUTHORITY, "groups/update", GROUPS_UPDATE);

		// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/delete/#
		uriMatcher.addURI(AUTHORITY, "groups/delete/#", GROUPS_DELETE);

		// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group/insert
		uriMatcher.addURI(AUTHORITY, "thread_group/insert", THREAD_GROUP_INSERT);

		// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group
		uriMatcher.addURI(AUTHORITY, "thread_group", THREAD_GROUP_QUERY_ALL);

		// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group/#
		uriMatcher.addURI(AUTHORITY, "thread_group/#", THREAD_GROUP_QUERY);
	}

	@Override
	public boolean onCreate() {
		//拿到数据库
		mOpenHelper = GroupOpenHelper.getInstance(getContext());
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db = mOpenHelper.getReadableDatabase();
		switch (uriMatcher.match(uri)) {
		case GROUPS_QUERY_ALL:
			if(db.isOpen()) {
				Cursor cursor = db.query(GROUPS_TABLE, projection, selection, selectionArgs, null, null, sortOrder);
				cursor.setNotificationUri(getContext().getContentResolver(), SmsUtils.GROUPS_QUERY_ALL_URI);
				return cursor;
			}
			break;
		case THREAD_GROUP_QUERY_ALL:
			if(db.isOpen()) {
				return db.query(THREAD_GROUP_TABLE, projection, selection, selectionArgs, null, null, sortOrder);
			}
			break;
		case THREAD_GROUP_QUERY:
			if(db.isOpen()) {
				long id = ContentUris.parseId(uri);
				String where = "_id = " + id;
				if(!TextUtils.isEmpty(selection)) {
					where = selection + " and " + where;
				}
				return db.query(THREAD_GROUP_TABLE, projection, where, selectionArgs, null, null, sortOrder);
			}
			break;
		default:
			throw new IllegalArgumentException("Unknow Uri : " + uri);
		}
		return null;
	}

	@Override
	public String getType(Uri uri) {
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		switch (uriMatcher.match(uri)) {
		case GROUPS_INSERT:
			if(db.isOpen()) {
				long id = db.insert(GROUPS_TABLE, null, values);
				getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);
				return ContentUris.withAppendedId(uri, id);
			}
			break;
		case THREAD_GROUP_INSERT:
			if(db.isOpen()) {
				long id = db.insert(THREAD_GROUP_TABLE, null, values);
				return ContentUris.withAppendedId(uri, id);
			}
			break;
		default:
			throw new IllegalArgumentException("Unknow Uri : " + uri);
		}
		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		switch (uriMatcher.match(uri)) {
		case GROUPS_DELETE:
			SQLiteDatabase db = mOpenHelper.getWritableDatabase();
			if(db.isOpen()) {
				long group_id = ContentUris.parseId(uri);
				String where = "_id = " + group_id;
				if(!TextUtils.isEmpty(selection)) {
					where = selection + " and " + where;
				}
				int count = db.delete(GROUPS_TABLE, where, selectionArgs);
				getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);
				where = "group_id = " + group_id;
				db.delete(THREAD_GROUP_TABLE, where, null);
				return count;
			}
			break;
		default:
			throw new IllegalArgumentException("Unknow Uri : " + uri);
		}
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		switch (uriMatcher.match(uri)) {
		case GROUPS_UPDATE:
			SQLiteDatabase db = mOpenHelper.getWritableDatabase();
			if(db.isOpen()) {
				int count = db.update(GROUPS_TABLE, values, selection, selectionArgs);

				getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);
				return count;
			}
			break;
		default:
			throw new IllegalArgumentException("Unknow Uri : " + uri);
		}
		return 0;
	}

}

在清单文件中注册:

   <provider
            android:name=".provider.GroupContentProvider"
            android:authorities="com.freedom.intelligencesms.provider.GroupContentProvider" >
        </provider>

这样,一个内容提供者就写好了。当我们需要调用的时候。

String path = content://sms/
Uri uri = uri.parse(path)

ContentResolver resolver = getContentResolver();

Cursor cursor = resolver.query(uri。。。。。。。)

有时候,我们需要监听数据库中对应数据变化的时候,这时就需要用到内容观察者。也是直接上使用代码了:

//内容观察者

ContentResolver resolver = getContentResolver();

resolver.registerContentObserver(uri,true,new MyOberserver(new Handler))

private class Myobserver extends ContentObserver
{
	public MyObserver(Handler handler){
		super(handler)
	}

	//当内容观察者发现数据库变化的时候调用这个方法
	//观察到消息邮箱里面有一个数据变化时,通知
	public void onChange(boolean selfChange)
	{
		super.onChange(selfChange);
		Uri uri = uri.parse("content://sms");

		ContentResolver resolver = getContentResolver();

		Cursor cursor = resolver.query(uri,new String[]{"address","date",""type","body"},null,null,null);//从短信数据库获取指定内容
		while(cursor.moverToNext())
		{
			String address = cursor.getString(0)
			......

		}//获取所有短信信息

		cursor.moveToLast()//指向最后一条短信
		cursor.moveToFirst()//指向最新一条短信		

	}

}

由于准备不充分,时间冲忙,这篇文章写得不是很好,望大家谅解。

时间: 2024-10-11 21:50:25

Android开发之浅谈内容提供者provider的使用的相关文章

Android开发:浅谈MVP模式应用与内存泄漏

最近博主开始在项目中实践MVP模式,却意外发现内存泄漏比较严重,但却很少人谈到这个问题,促使了本文的发布,本文假设读者已了解MVP架构. 本文原创作者:xiong_it,链接:http://blog.csdn.net/xiong_it MVP简介 M-Modle,数据,逻辑操作层,数据获取,数据持久化保存.比如网络操作,数据库操作 V-View,界面展示层,Android中的具体体现为Activity,Fragment P-Presenter,中介者,连接Modle,View层,同时持有modl

android开发之浅谈viewpager

之前为了写一个安卓的原生时钟的时候要用到这个viewpager,当时在网上找了很多都没有一个理想的教程,今天索性把自己的见解分享出来. viewpager 和ListView类似,我们也需要一个适配器,他就是PagerAdapter.ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样. 要实现viewpager要三个步骤: 1:实现自己的布局文件. 2:加载要显示的布局. 3:实例化ViewPager组件,设置Adapte,重写PagerAdapter. content

Android 开发笔记“浅谈DDMS视图”

DDMS 的全称是Dalvik Debug Monitor Service,即Dalvik调试监控服务,是一个可视化的调试监控工具.它主要是对系统运行后台日志的监控,还有系统线程,模拟器状态的监控.此外,它还可以模拟收发短信,拨打电话和发送GPS位置信息等. 在eclipse中启动DDMS 1.在eclipse界面的右上角,点击,出现下面的界面 2.选择other,这时界面如下图所示,双击DDMS就可以启动  DDMS各部分组成的功能简介 1.Devices    可以查看到所有与DDMS连 接

Android安全开发之浅谈密钥硬编码

Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风险.信息安全的基础在于密码学,而常用的密码学算法都是公开的,加密内容的保密依靠的是密钥的保密,密钥如果泄露,对于对称密码算法,根据用到的密钥算法和加密后的密文,很容易得到加密前的明文:对于非对称密码算法或者签名算法,根据密钥和要加密的明文,很容易获得计算出签名值,从而伪造签名. 2 风险案例 密钥硬

安卓开发_浅谈Android动画(四)

Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属性动画类 方法 描述 setDuration(long duration) 设置动画持续时间的方法 setEvaluator(TypeEvaluator value) 设置插值计算的类型 setInterpolator(TimeInterpolator value) 设置时间插值器的类型 addUp

安卓开发_浅谈ListView(自定义适配器)

ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ,实现图片文字混合列表 1 package com.example.work; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 7 8 import android.R.in

安卓开发_浅谈主配置文件(AndroidManifest.xml)

AndroidManifest.xml本质:是整个应用的主配置清单文件包含:该应用的包名,版本号,组件,权限等信息作用:记录该应用的相关的配置信息 一.常用标签(1).全局篇(包名,版本信息)(2).组件篇(四大组件).(3).权限篇(申请权限和定义权限)1.全局篇(1).应用的包名以及版本信息的管理package="com.example.tset" android:versionCode="1"android:versionName="1.0"

流媒体网站开发技术浅谈

流媒体网站开发技术浅谈(2012-02) 2012-03-02    新闻来源:武汉广电网 张方东 (黄陂区广播影视局事业技术科) 摘 要:随着有线和无线网络宽带的高速发展,人们不再满足于因特网中仅有的文字.图片等简单信息,而越来越希望看到更直观.更丰富的影视节目,流媒体网站因此应运而生.本文从流媒体概念.流媒体格式.流媒体文件制作.流媒体文件传输.流媒体文件发布及流媒体网站部署等方面对开发流媒体网站作了详细阐述. 关键词:流媒体 网站开发 部署 技术 1.概述 在网络上传输多媒体有下载和流式传

Android开发之ContentProvider(内容提供者)

1. ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同. 如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据. 而使用ContentProvider共享数据的好处是统一了数据访问方式 2.通过ContentProv