Android中的UriMatcher、ContentUrist和ContentResolver

因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。

UriMatcher:用于匹配Uri,它的用法如下:
       1.首先把你需要匹配Uri路径全部给注册上,如下:

Java代码:

  1. //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
  2. UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  3. //如果match()方法匹配content:.sqlite.provider.contactprovider/contact路径,返回匹配码为1
  4. uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);
  5. //添加需要匹配uri,如果匹配就会返回匹配码
  6. //如果match()方法匹配 content.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
  7. uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);
  8. //#号为通配符

复制代码

2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配

content:.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。

        ContentUris用于获取Uri路径后面的ID部分,它有两个比较实用的方法:

withAppendedId(uri, id)用于为路径加上ID部分parseId(uri)方法用于从路径中获取ID部分

        ContentResolver
外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver
类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。
ContentResolver使用insert、delete、update、query方法,来操作数据。

       ContentProvider示例程序

我们为昨天的SQLite示例程序添加一个ContentProvider,供其他应用来访问我们的数据。

       1.为SQLite示例程序添加ContentProvider类

Java代码:

  1. package eoe.sqlite.provider;
  2. import com.changcheng.sqlite.MyOpenHelper;
  3. import android.content.ContentProvider;
  4. import android.content.ContentUris;
  5. import android.content.ContentValues;
  6. import android.content.UriMatcher;
  7. import android.database.Cursor;
  8. import android.database.sqlite.SQLiteDatabase;
  9. import android.net.Uri;
  10. public class ContactContentProvider extends ContentProvider {
  11. // 通过UriMatcher匹配外部请求
  12. private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  13. // 通过openHelper进行数据库读写
  14. private MyOpenHelper openHelper;
  15. // 匹配状态常量
  16. private static final int CONTACT_LIST = 1;
  17. private static final int CONTACT = 2;
  18. // 表名
  19. private static final String tableName = "contacts";
  20. // 添加Uri
  21. static {
  22. uriMatcher.addURI("com.changcheng.sqlite.provider", "contact",CONTACT_LIST);
  23. uriMatcher.addURI("com.changcheng.sqlite.provider", "contact/#",CONTACT);
  24. }
  25. @Override
  26. public int delete(Uri uri, String selection, String[] selectionArgs) {
  27. SQLiteDatabase db = this.openHelper.getWritableDatabase();
  28. int result;
  29. switch (uriMatcher.match(uri)) {
  30. case CONTACT_LIST:
  31. result = db.delete(tableName, selection, selectionArgs);
  32. break;
  33. case CONTACT:
  34. long id = ContentUris.parseId(uri);
  35. String where = "_id=" + id;
  36. if (selection != null && !"".equals(selection)) {
  37. where = where + " and " + selection;
  38. }
  39. result = db.delete(tableName, where, selectionArgs);
  40. break;
  41. default:
  42. throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
  43. }
  44. return result;
  45. }
  46. @Override
  47. public String getType(Uri uri) {
  48. switch (uriMatcher.match(uri)) {
  49. case CONTACT_LIST:// 集合类型必须在前面加上vnd.android.cursor.dir/
  50. return "vnd.android.cursor.dir/contactlist";
  51. case CONTACT:// 非集合类型必须在前面加上vnd.android.cursor.item/
  52. return "vnd.android.cursor.item/contact";
  53. default:
  54. throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
  55. }
  56. }
  57. @Override
  58. public Uri insert(Uri uri, ContentValues values) {
  59. SQLiteDatabase db = this.openHelper.getWritableDatabase();
  60. long id;
  61. switch (uriMatcher.match(uri)) {
  62. case CONTACT_LIST:
  63. // 因为后台需要生成SQL语句,当values为null时,必须提第二个参数。生成的SQL语句才不会出错!
  64. id = db.insert(tableName, "_id", values);
  65. return ContentUris.withAppendedId(uri, id);
  66. case CONTACT:
  67. id = db.insert(tableName, "_id", values);
  68. String uriPath = uri.toString();
  69. String path = uriPath.substring(0, uriPath.lastIndexOf("/")) + id;
  70. return Uri.parse(path);
  71. default:
  72. throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
  73. }
  74. }
  75. @Override
  76. public boolean onCreate() {
  77. this.openHelper = new MyOpenHelper(this.getContext());
  78. return true;
  79. }
  80. @Override
  81. public Cursor query(Uri uri, String[] projection, String selection,
  82. String[] selectionArgs, String sortOrder) {
  83. SQLiteDatabase db = this.openHelper.getWritableDatabase();
  84. switch (uriMatcher.match(uri)) {
  85. case CONTACT_LIST:
  86. return db.query(tableName, projection, selection, selectionArgs,null, null, sortOrder);
  87. case CONTACT:
  88. long id = ContentUris.parseId(uri);
  89. String where = "_id=" + id;
  90. if (selection != null && !"".equals(selection)) {
  91. where = where + " and " + selection;
  92. }
  93. return db.query(tableName, projection, where, selectionArgs, null,null, sortOrder);
  94. default:
  95. throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
  96. }
  97. }
  98. @Override
  99. public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {
  100. SQLiteDatabase db = this.openHelper.getWritableDatabase();
  101. int result;
  102. switch (uriMatcher.match(uri)) {
  103. case CONTACT_LIST:
  104. result = db.update(selection, values, selection, selectionArgs);
  105. break;
  106. case CONTACT:
  107. long id = ContentUris.parseId(uri);
  108. String where = "_id=" + id;
  109. if (selection != null && !"".equals(selection)) {
  110. where = where + " and " + selection;
  111. }
  112. result = db.update(tableName, values, where, selectionArgs);
  113. break;
  114. default:
  115. throw new IllegalArgumentException("Uri IllegalArgument:" + uri);
  116. }
  117. return result;
  118. }
  119. }

复制代码

Android中的UriMatcher、ContentUrist和ContentResolver

时间: 2024-11-10 13:02:55

Android中的UriMatcher、ContentUrist和ContentResolver的相关文章

Android中利用ContentResolver获取本地音乐和相册

在Android中,例如图库和音乐播放器,它们能够扫描我们的系统,获取到本地的相片跟音乐,这一点是如何做到的呢? 当我们往手机上放图片或者音乐的时候,会在手机内存中某个位置上的某个database中存放图片或者音乐的信息,而我们的应用程序是能够通过ContentResolver去读取到这些数据的. 下面可以先看一下database在哪,如下: 然后在data/data/下面呢,有很多provider提供的数据库,而我们的音乐或者图片就是在一个叫做Media的库下: external是智能手机中内

Android中内容提供者ContentProvider实现数据库增删改查

1.我们首先new一个我们自己的类集成ContentProvider,并实现方法如下 package com.wzw.sqllitedemo.providers; import com.wzw.sqllitedemo.db.PersonSQLiteOpenHelper; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues;

Android中的跨进程通信方法实例及特点分析(二):ContentProvider

1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据.比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能). 这种优点是统一管理,比方添加了某个音频文件,底层就会将这种变化通知Content Provider.从而当应用程序訪问

Android中内容观察者的使用---- ContentObserver类详解 (转)

前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对ContentObserver做下总结. ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.触发器分为表触发器.行触发器, 相

Android中内容观察者的使用---- ContentObserver类详解

  转载请注明出处:http://blog.csdn.net/qinjuning 前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对ContentObserver做下总结. ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObs

Android中实现IPC的几种方式详细分析及比较

1.使用Bundle   ----> 用于android四大组件间的进程间通信 android的四大组件都可使用Bundle传递数据  所以如果要实现四大组件间的进程间通信 完全可以使用Bundle来实现 简单方便 2.使用文件共享  ---->用于单线程读写 这种方式在单线程读写的时候比较好用 如果有多个线程并发读写的话需要限制线程的同步读写 另外 SharePreference是个特例  它底层基于xml实现  但是系统对它的读写会基于缓存,也就是说再多进程模式下就变得不那么可靠了,有很大

Android中Intent组件详解

Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作.与动作有关的数据等.Android则根据此Intent对象之叙述,负责配对,找出相配的组件,然后将 Intent对象传递给所找到的组件,Android的媒婆任务就完成了. 在Google Doc中是这样描述Intent的(摘自Android中文翻译组)当接收到ContentR

Android笔记——Android中数据的存储方式(三)

Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存取,现在的主流移动设备像Android.iPhone等都使用SQLite作为复杂数据的存储引擎,并且它是以手机内存为储存的. 那么,实际开发项目中有大量数据需要读写,并且需要面临大量用户的并发储存的情况呢.就不应该把数据存放在手机等移动设备的SQLite数据库里,移动设备的储存能力和计算能力都不足以

一个Demo学完Android中所有的服务(转)

说明:这个例子实现了Android中常见的许多服务,下面是实现的截图 接下来,以源代码的方式分析这个例子   1.MainActivity--主界面 这个类主要是实现用户所看到的这个Activity,其中包含了一系列的按钮,用户点击按钮执行相应的动作,所以在这个类中主要是对按钮的定义和对按钮绑定相应的监听器,下面是实现的代码: [java] view plaincopyprint? package lovefang.stadyService; import android.app.Activit