我的android 第26天 - 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; } }
三、关注点
. 理解Android ContantProvider 机制
. Uri格式
. 运用UriMatcher匹配Uri
.运用ContentUris为Uri添加或截取尾部的ID数据
ContentUris.withAppendedId(uri, 10):给Uri尾部添加10(id)
ContentUris.parseId(uri);//获取尾部的id
. 如何监听ContentProvider数据的改变
. getType:返回所访问数据的minetype(image/jpeg plain/text
image/png)
下载视频代码
下载视频代码
相关推荐
食物与食物接触的父母食物与食物接触的父母食物与食物接触的父母食物与食物接触的父母
Create React App入门 该项目是通过引导的。 可用脚本 在项目目录中,可以运行: npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何...
我们安装好EditPlusr后,在菜单栏中,有【工具(T)】 -> 【配置用户工具】的菜单,打开过后,我们点击【添加工具组】 -> 【应用程序】 ...shell-comment-to-double-slashes-comment --indent-with-tab --force-large-...
原因是因为它的小巧,快速,绿色,强大,有很多很多的优点,让我不得不去使用它。昨天晚上升级了一下EditPlus到最新版,发现在图标和界面上都改变了不少,很是喜欢。EditPlus还有一个很好的功能就是可以集成插件,...
3、从源码framework\ex\common\java\com\android\common\content\syncstateContentProviderHelper.java取到这个类放到项目中,我是创了一个包com.android.common.contant放进去的,放到项目其他包下不知道会怎样。...
这是一个用引导的项目。入门首先,运行开发服务器: npm run dev# oryarn dev 用浏览器打开以查看结果。 您可以通过修改pages/index.js来开始编辑页面。 页面在您编辑文件时自动更新。 可以在上访问。...
说来惭愧,我花了半天时间才搞出来(自黑一下~),接下来分享给大家,先上效果图: vue页面: <div class=dealRecord-wrap> <div class=title-contant v-for=(item,index)> (index)> <h3>2018年0{{index+6}...
为理论物理的课件,相当好! 王学习物理的人都来踩以下!
下面介绍Contant.java CLIENT_ID 中的参数: App ID,可从AppGallery Connect 网站获取,请替换为您应用的客户端ID。 CERT_URL:请求CERT_URL从jwks_uri获取公钥的URL,然后获取公钥。 ID_TOKEN_ISSUE:ID Token 的...
this is my files contant some codes .
主要介绍了Ajax的content-download时间过慢问题的解决方法及思考过程,本文通过事件背景,过程分析,给大家介绍的非常详细,需要的朋友参考下吧
本文实例为大家分享了微信小程序实现星星评价效果的具体代码,供大家参考,具体内容如下 代码实现 ... <block wx:for='{{evaluate_contant}}' wx:key='' wx:for-index='idx'> <view class='evalua
CQT-FW(具有固定长度窗口的恒定Q变换)是一种时频变换,用于音频信号(歌曲)中的多个音高识别。 像音乐一样,变换CQT(常数Q变换)以指数方式提供analisys频率,但是它在时间分辨率方面存在问题。...
第二个方面是无机物指标:有毒金属、有毒准金属、硝酸盐、亚硝酸盐、磷酸盐等。第三方面是非专一性有机物指标:总耗氧量、化学耗氧量、生化耗氧量、总有机碳、高锰酸钾指数、酚类等。第四方面是溶解性气体:氧气、二...
Walnut是使用MySQL数据库以PHP编写的Contant管理系统。 易于使用和管理。 注意:这个项目在很多年前就被放弃了。
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.
(二)、小程序接口说明 wx.chooseLocation(Object object) 从本地相册选择图片或使用相机拍照。 (三)、效果图 效果如下: (四)、代码展示 WXML页面: <view class=contant_wrap> <view class=contant> <...
ch.ethz.idsc.subare Java 0.3.8版中用于强化学习的库存储库包括第二版《 Richard S. Sutton和Andrew G. Barto撰写的算法,示例和练习。 我们的实现受到Zhang Shangtong的的启发,但在两个方面与参考文献有所不同: ...
语言:中文 (繁體) Edit by Tony Kuo 提供自动登入,志愿序选课。...注意:使用此软体仍然有机会失败,一切都只是辅助Notice : You may still fail on shcool system.Contant:jinniw43805@gmail.com