`
_小菜鸟
  • 浏览: 34225 次
社区版块
存档分类
最新评论

我的android 第17天 - Contant Provider

 
阅读更多

我的android 第17天 - Contant Provider

 

   介绍:Contant Provider内容提供者,android四大组件之一,使用于多个应用同时使用同一份数据。它对不同的数据存储(file\sqlite\intent)进行了封装,提供了统一的数据访问方式.android系统内部很多内容都以内容提供者的形式共享输出,比如联系人信息、短信等

 案例:采用Contant Provider共享SQLite person表的数据,

  实现增删改查等操作

 

一、Contant Provider机制


 

 

二、采用内容提供者共享数据实现过程

1、继承ContantProvider,重写以下方法(代码参考:备注页)

•boolean onCreate():创建ContantProvider时调用
•Uriinsert(Uri uri, ContentValues values)

插入操作

•int delete(Uri uri,String selection, String[] selectionArgs):删除操作
• intupdate(Uri uri, ContentValues values, String selection, String[]selectionArgs):更新操作
• Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs, String sortOrder):查询操作
•StringgetType(Uri uri):返回数据的MINE-TYPE

2、内容提供者为android四大组件之一,需要在AndroidManifest.xml中注册

 

public class PersonProvider extends ContentProvider {
	static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
	private static final int MULTI = 1;
	private static final int SINGLE = 2;
	static {
		// content://cn.itcast.sqlite.providers.personprovider/person
		matcher.addURI("cn.itcast.sqlite.providers.personprovider", "person", MULTI);
		
		//  content://cn.itcast.sqlite.providers.personprovider/person/4
		matcher.addURI("cn.itcast.sqlite.providers.personprovider", "person/#", SINGLE);
	}
	DBHelper helper;
	/**
	 * 初始化ContentProvider的时候调用
	 */
	public boolean onCreate() {
		helper = new DBHelper(getContext());
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db = helper.getReadableDatabase();
		
		switch (matcher.match(uri)) {
		case MULTI: //访问多条数据 content://cn.itcast.sqlite.providers.personprovider/person
			return db.query(PersonMgr.TABLE, projection, selection, selectionArgs, null, null, sortOrder);
		case SINGLE: // 访问单条数据 content://cn.itcast.sqlite.providers.personprovider/person/4
			// 解析Uri尾部的id
			long id = ContentUris.parseId(uri);
			String where = PersonMgr.ID + " = " + id;
			if (selection!=null && !"".equals(selection.trim())) {
				where += " and " + selection;
			}
			return db.query(PersonMgr.TABLE, projection, where, selectionArgs, null, null, sortOrder);
		case UriMatcher.NO_MATCH: // uri不合法
			throw new IllegalArgumentException("uri不合法");
		}
		return null;
	}
	
	/**
	 * 返回数据的MINE-TYPE : image/jpeg  plain/text image/png
	 */
	public String getType(Uri uri) {
		switch (matcher.match(uri)) {
		case MULTI: //多条数据 content://cn.itcast.sqlite.providers.personprovider/person
			return "vnd.android.cursor.dir/person";
		case SINGLE: // 单条数据 content://cn.itcast.sqlite.providers.personprovider/person/4
			return "vnd.android.cursor.item/person";
		case UriMatcher.NO_MATCH: // uri不合法
			throw new IllegalArgumentException("uri不合法");
		}
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// content://cn.itcast.sqlite.providers.personprovider/person
		SQLiteDatabase db = helper.getWritableDatabase();
		
		switch (matcher.match(uri)) {
		case MULTI: // content://cn.itcast.sqlite.providers.personprovider/person
			long id = db.insert(PersonMgr.TABLE, null, values); 
			db.close();
			
			// 发出数据改变的通知
			getContext().getContentResolver().notifyChange(uri, null);
			return ContentUris.withAppendedId(uri, id);
		default: // uri不合法
			throw new IllegalArgumentException("uri不合法");
		}
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = helper.getReadableDatabase();
		int result = 0;
		switch (matcher.match(uri)) {
		case MULTI: //多条数据 content://cn.itcast.sqlite.providers.personprovider/person
			result =  db.delete(PersonMgr.TABLE, selection, selectionArgs);
			break;
		case SINGLE: // 单条数据 content://cn.itcast.sqlite.providers.personprovider/person/4
			String where = PersonMgr.ID + "=" + ContentUris.parseId(uri);
			if (selection != null && !"".equals(selection.trim())) {
				where += " and " + selection;
			}
			result =  db.delete(PersonMgr.TABLE, where, selectionArgs);
			break;
		case UriMatcher.NO_MATCH: // uri不合法
			throw new IllegalArgumentException("uri不合法");
		}
		db.close();
		return result;
	}

	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		SQLiteDatabase db = helper.getReadableDatabase();
		int result = 0;
		switch (matcher.match(uri)) {
		case MULTI: //多条数据 content://cn.itcast.sqlite.providers.personprovider/person
			result =  db.update(PersonMgr.TABLE, values, selection, selectionArgs);
			break;
		case SINGLE: // 单条数据 content://cn.itcast.sqlite.providers.personprovider/person/4
			String where = PersonMgr.ID + "=" + ContentUris.parseId(uri);
			if (selection != null && !"".equals(selection.trim())) {
				where += " and " + selection;
			}
			result =  db.update(PersonMgr.TABLE, values, where, selectionArgs);
			break;
		case UriMatcher.NO_MATCH: // uri不合法
			throw new IllegalArgumentException("uri不合法");
		}
		db.close();
		return result;
	}

}

 

 

三、关注点

 . 理解AndroidContantProvider机制

 . Uri格式

   

 

 . 云用UriMatcher匹配Uri

 

 .运用ContentUrisUri添加或截取尾部的ID数据

   ContentUris.withAppendedId(uri, 10):给Uri尾部添加10id

       ContentUris.parseId(uri);//获取尾部的id

   . 如何监听ContentProvider数据的改变

   .getType:返回所访问数据的minetypeimage/jpeg plain/text 

      image/png

 

 

下载视频代码

分享到:
评论

相关推荐

    food-soial-contant-parent

    食物与食物接触的父母食物与食物接触的父母食物与食物接触的父母食物与食物接触的父母

    bonus-contant-40.5

    Create React App入门 该项目是通过引导的。 可用脚本 在项目目录中,可以运行: npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何...

    PHP代码美化 格式化 反格式化

    我们安装好EditPlusr后,在菜单栏中,有【工具(T)】 -> 【配置用户工具】的菜单,打开过后,我们点击【添加工具组】 -> 【应用程序】 ...shell-comment-to-double-slashes-comment --indent-with-tab --force-large-...

    PHPCB1.01 EditPlus+PHPCB打造完美的PHP代码格式化功能

    原因是因为它的小巧,快速,绿色,强大,有很多很多的优点,让我不得不去使用它。昨天晚上升级了一下EditPlus到最新版,发现在图标和界面上都改变了不少,很是喜欢。EditPlus还有一个很好的功能就是可以集成插件,...

    在windows下编译运行android原生浏览器需要的包类

    3、从源码framework\ex\common\java\com\android\common\content\syncstateContentProviderHelper.java取到这个类放到项目中,我是创了一个包com.android.common.contant放进去的,放到项目其他包下不知道会怎样。...

    contant-manager-app-deployed

    这是一个用引导的项目。入门首先,运行开发服务器: npm run dev# oryarn dev 用浏览器打开以查看结果。 您可以通过修改pages/index.js来开始编辑页面。 页面在您编辑文件时自动更新。 可以在上访问。...

    vue.js 实现点击展开收起动画效果

    说来惭愧,我花了半天时间才搞出来(自黑一下~),接下来分享给大家,先上效果图: vue页面: <div class=dealRecord-wrap> <div class=title-contant v-for=(item,index)> (index)> <h3>2018年0{{index+6}...

    theorcial physics contant

    为理论物理的课件,相当好! 王学习物理的人都来踩以下!

    华为研发笔试题西安Java-huawei-account-demo:快速集成华为帐号的示例代码。HUAWEIAccountKit为开发者提供简

    下面介绍Contant.java CLIENT_ID 中的参数: App ID,可从AppGallery Connect 网站获取,请替换为您应用的客户端ID。 CERT_URL:请求CERT_URL从jwks_uri获取公钥的URL,然后获取公钥。 ID_TOKEN_ISSUE:ID Token 的...

    poashvyas - 副本 (2)_code_

    this is my files contant some codes .

    如何解决Ajax的content-download时间过慢问题

    主要介绍了Ajax的content-download时间过慢问题的解决方法及思考过程,本文通过事件背景,过程分析,给大家介绍的非常详细,需要的朋友参考下吧

    微信小程序实现星星评价效果

    本文实例为大家分享了微信小程序实现星星评价效果的具体代码,供大家参考,具体内容如下 代码实现 ... <block wx:for='{{evaluate_contant}}' wx:key='' wx:for-index='idx'> <view class='evalua

    CQT-FW:CQT-FW是用于多音高识别的音频analisys工具-开源

    CQT-FW(具有固定长度窗口的恒定Q变换)是一种时频变换,用于音频信号(歌曲)中的多个音高识别。 像音乐一样,变换CQT(常数Q变换)以指数方式提供analisys频率,但是它在时间分辨率方面存在问题。...

    waterDetection-master安徽农业大学 水质检测系统.rar

    <div id="zhibiao_contant"> <div class="zhibiao" id="zhibiao1"><h3>生物指标 河水中含有的各种物质均是反映水质情况的重要指标,而水中含有的物质也是复杂的,从生物类...

    Walnut CMS-开源

    Walnut是使用MySQL数据库以PHP编写的Contant管理系统。 易于使用和管理。 注意:这个项目在很多年前就被放弃了。

    my ping program

    this is myping program,it can be run in linux system,and contant the makefile file,you can use the make command to compaire this program.

    微信小程序实现图片选择并预览功能

    本文实例为大家分享了微信小程序实现图片选择并预览的具体代码,供大家参考,具体内容如下 (一)、功能说明 做的是一个意见反馈,用户发表意见... <view class=contant_wrap> <view class=contant> <textarea name

    subare:萨顿和巴托的书中的强化学习算法

    第65页) 确定Q *(s,a)的操作值迭代(并行) 首次访问政策评估(第5.1页,第74页) 蒙特卡洛探索之旅(第5.3页,第79页) Contant-alpha蒙特卡洛表格时差(in 6.1,p.96) Sarsa :一种策略上的TD控制算法(在6.4...

    TKU選課不哭不哭-crx插件

    语言:中文 (繁體) Edit by Tony Kuo 提供自动登入,志愿序选课。...注意:使用此软体仍然有机会失败,一切都只是辅助Notice : You may still fail on shcool system.Contant:jinniw43805@gmail.com

Global site tag (gtag.js) - Google Analytics