Android中的UriMatcher、ContentUrist和ContentResolver
因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。
UriMatcher:用于匹配Uri,它的用法如下:
1.首先把你需要匹配Uri路径全部给注册上,如下:
Java代码:
- //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
- UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- //如果match()方法匹配content:.sqlite.provider.contactprovider/contact路径,返回匹配码为1
- uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);
- //添加需要匹配uri,如果匹配就会返回匹配码
- //如果match()方法匹配 content.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
- uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);
- //#号为通配符
复制代码
外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver
类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。
ContentResolver使用insert、delete、update、query方法,来操作数据。
- package eoe.sqlite.provider;
- import com.changcheng.sqlite.MyOpenHelper;
- 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 ContactContentProvider extends ContentProvider {
- // 通过UriMatcher匹配外部请求
- private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- // 通过openHelper进行数据库读写
- private MyOpenHelper openHelper;
- // 匹配状态常量
- private static final int CONTACT_LIST = 1;
- private static final int CONTACT = 2;
- // 表名
- private static final String tableName = "contacts";
- // 添加Uri
- static {
- uriMatcher.addURI("com.changcheng.sqlite.provider", "contact",CONTACT_LIST);
- uriMatcher.addURI("com.changcheng.sqlite.provider", "contact/#",CONTACT);
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- SQLiteDatabase db = this.openHelper.getWritableDatabase();
- int result;
- switch (uriMatcher.match(uri)) {
- case CONTACT_LIST:
- result = db.delete(tableName, selection, selectionArgs);
- break;
- case CONTACT:
- long id = ContentUris.parseId(uri);
- String where = "_id=" + id;
- if (selection != null && !"".equals(selection)) {
- where = where + " and " + selection;
- }
- result = db.delete(tableName, where, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
- }
- return result;
- }
- @Override
- public String getType(Uri uri) {
- switch (uriMatcher.match(uri)) {
- case CONTACT_LIST:// 集合类型必须在前面加上vnd.android.cursor.dir/
- return "vnd.android.cursor.dir/contactlist";
- case CONTACT:// 非集合类型必须在前面加上vnd.android.cursor.item/
- return "vnd.android.cursor.item/contact";
- default:
- throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
- }
- }
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- SQLiteDatabase db = this.openHelper.getWritableDatabase();
- long id;
- switch (uriMatcher.match(uri)) {
- case CONTACT_LIST:
- // 因为后台需要生成SQL语句,当values为null时,必须提第二个参数。生成的SQL语句才不会出错!
- id = db.insert(tableName, "_id", values);
- return ContentUris.withAppendedId(uri, id);
- case CONTACT:
- id = db.insert(tableName, "_id", values);
- String uriPath = uri.toString();
- String path = uriPath.substring(0, uriPath.lastIndexOf("/")) + id;
- return Uri.parse(path);
- default:
- throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
- }
- }
- @Override
- public boolean onCreate() {
- this.openHelper = new MyOpenHelper(this.getContext());
- return true;
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- SQLiteDatabase db = this.openHelper.getWritableDatabase();
- switch (uriMatcher.match(uri)) {
- case CONTACT_LIST:
- return db.query(tableName, projection, selection, selectionArgs,null, null, sortOrder);
- case CONTACT:
- long id = ContentUris.parseId(uri);
- String where = "_id=" + id;
- if (selection != null && !"".equals(selection)) {
- where = where + " and " + selection;
- }
- return db.query(tableName, projection, where, selectionArgs, null,null, sortOrder);
- default:
- throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
- }
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {
- SQLiteDatabase db = this.openHelper.getWritableDatabase();
- int result;
- switch (uriMatcher.match(uri)) {
- case CONTACT_LIST:
- result = db.update(selection, values, selection, selectionArgs);
- break;
- case CONTACT:
- long id = ContentUris.parseId(uri);
- String where = "_id=" + id;
- if (selection != null && !"".equals(selection)) {
- where = where + " and " + selection;
- }
- result = db.update(tableName, values, where, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
- }
- return result;
- }
- }
复制代码
Android中的UriMatcher、ContentUrist和ContentResolver的更多相关文章
- Android中的5种数据存储方式
本文转自 http://hi.baidu.com/maguowei/blog/item/7aca46c25574a33ae5dd3ba4.htmlAndroid数据存储Android提供了5种方式存 ...
- Android学习记录(3)—Android中ContentProvider的基本原理学习总结
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...
- Android中内容提供者ContentProvider的详解
1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不 ...
- Android中内容观察者的使用---- ContentObserver类详解 (转)
前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...
- 【转】Android中实现IPC的几种方式详细分析及比较
1.使用Bundle ----> 用于android四大组件间的进程间通信android的四大组件都可使用Bundle传递数据 所以如果要实现四大组件间的进程间通信 完全可以使用Bundl ...
- android中的ContentProvider实现数据共享
为了在应用程序之间交换数据,android中提供了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API.当一个应用程序需要把自己的数据暴露给其他程序 ...
- android 中获取视频文件的缩略图(非原创)
在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...
- 一个Demo学完Android中所有的服务(转)
说明:这个例子实现了Android中常见的许多服务,下面是实现的截图 接下来,以源代码的方式分析这个例子 1.MainActivity--主界面 这个类主要是实现用户所看到的这个Activity, ...
随机推荐
- Bootstrap-table固定表头并解决表头与内容不对齐
写在前面: 之前在做表格的时候,一直忽略了表格的height高度,导致表格的的表头不能固定,这个样子当表格数据过多的时候,导致无法分辨表头是什么,所以决定固定表头. 固定表头需要使用height这一属 ...
- 【Data URL】【RE】【bugku】逆向入门writeup
在写wp之前先来了解一下Data URL是什么 Data URL 在浏览器向服务端发送请求来引用资源时,一般浏览器都有同一时间并发请求数不超过4个的限制.所以如果一个网页需要引用大量的服务端资源,就会 ...
- 调整Chrome中文字体为雅黑
几天试了一下Chrom发布的Chrome 37,感觉所谓的Direct2D渲染还是有些效果的,但这只体现在英文上,中文的宋体还是非常的不舒服,便试着将其替换成了雅黑,这里介绍一下相关方法. Chrom ...
- Android进阶笔记:AIDL内部实现详解 (二)
接着上一篇分析的aidl的流程解析.知道了aidl主要就是利用Ibinder来实现跨进程通信的.既然是通过对Binder各种方法的封装,那也可以不使用aidl自己通过Binder来实现跨进程通讯.那么 ...
- 万里长征第二步——django个人博客(第二步 ——日志记录器)
定义日志记录器 可以在setting.py里设置日志记录器 # 自定义日志输出信息 LOGGING = { 'version': 1, 'disable_existing_loggers': True ...
- CDN混战何去何从,史上最全分析
近日,CDN市场风起云涌,十几年平稳的市场格局瞬时战火纷飞.一路从传统CDN即蓝汛.网宿为主的 "双雄争霸".演变为多家云CDN厂商阿里云.腾讯云.百度云等的降价大战.更有 ...
- 利用pycharm进行重构学习记录
pycharm是非常强大的pythonIDE,集成了很多实用的功能,其中就包括重构Refactor 记录下使用pycharm的重构 pycharm的Refactor默认在主菜单上就有了 Refacto ...
- [Python爬虫] 之二十九:Selenium +phantomjs 利用 pyquery抓取节目信息信息
一.介绍 本例子用Selenium +phantomjs爬取节目(http://tv.cctv.com/epg/index.shtml?date=2018-03-25)的信息 二.网站信息 三.数据抓 ...
- solr 高亮显示
官网:https://lucene.apache.org/solr/guide/6_6/highlighting.html#Highlighting-TheUnifiedHighlighter 前言 ...
- H5+CSS3简单动画 知识点 汇总
乱入几个: 1.h5的一个语义化标签 figure :用于规定独立的流内容(图像 图表 照片 代码等) figcapition:与figure配套使用,用于标签定义figure元素标题 2. ...