Android中的uri有些类似网络上常用的url地址。
scheme://host/path
1、scheme:协议:Android规定,在数据共享操作时,协议名必须是content。
2、host -主机名:唯一的标识ContentProvider的ID,该ID值在Android中是唯一的。
这个值就是AndroidManifest.xml中 authorities的属性值
3、路径(或称资源索引值):通过索引值找到指定的资源。
Content://com.example.provider.test/person
注意:ContentProvider主要提供对数据库的操作,但也允许操作文本文件、XML文件等
因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。
UriMatcher
1、UriMatcher(int code)
构造方法,传入的匹配码是使用match()方法匹配根路径时返回的值,这个匹配码可以为一个大于零的数表示匹配根路径或传入-1。
UriMatcher uriMatcher = new UriMathcer(UriMatcher.NO_MATCH);
2、UriMatcher.NO_MATCH
表示不匹配任何路径的返回码,值为-1
3、uriMatcher.addURI(String strUri);
作用:添加需要匹配的Uri
示例:uriMathcer.addURI("com.example.provider.test","person","1");
说明:
param1:传入标识ContentProvider的AUTHORITY字符串
param2:传入需要匹配的路径,这里的#代表匹配任意数字,另外还可以用*来匹配任意文本。
param3:必须传入一个大于零的匹配码,用于match()方法对相匹配的URI返回相对应的匹配码。
4、uriMatcher.match(uri);
作用:对Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法的param3.
示例:
Uri uri = Uri.parse("content://com.example.provider.test/person");
int code = uriMatcher.match(uri);
因为3中示例addURI()中的匹配码是1,所以这里返回的是code=1;
若不匹配,则返回值为-1.
ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
withAppendedId(uri, id); 用于为路径加上ID部分
parseId(uri); 方法用于从路径中获取ID部分
下面通过演示ContentProviider访问多个共享表来说明UriMatcher的用法
步骤1、在项目中创建MySQLiteHelper类,用于创建本案例的库和表(表有person,student两张)。
步骤2、
a、创建MyProvider类,extends ContentProvider.
b、提供增删改查
c、创建一个UriMatcher常量,提供两个常量用来表示person和student表
代码如下:
public class MyProvider extends ContentProvider { // 创建UriMatcher对象,该对象是个常量 。默认不匹配任何URI public static final UriMatcher URI_MATCHER = new UriMatcher( UriMatcher.NO_MATCH); // 创建uri中host部分的字符串,该值确保与其他uri地址不同 public static final String AUTHORITY = "com.example.myProvider.test"; public static final int PERSON = 1; // person表的匹配码 public static final int STUDENT = 2;// student表的匹配码 // 为UriMatcher调价两个匹配的uri匹配码 static { URI_MATCHER.addURI(AUTHORITY, "person", PERSON); URI_MATCHER.addURI(AUTHORITY, "student", STUDENT); } MySQLiteOpenHelper mSQLiteOpenHelper; //----------------------------只展示了关键代码----------------------- @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = mSQLiteOpenHelper.getReadableDatabase(); String tableName = ""; // uri = Uri.parse("content://com.example.myProvider.test/person"); //对Uri进行匹配,如果匹配就返回匹配码 switch (URI_MATCHER.match(uri)) { case PERSON: tableName = Persons.TABLE_PERSON_NAME; break; case STUDENT: tableName = Persons.TABLE_STUDENT_NAME; break; } Cursor cursor = db.query(tableName, projection, selection, selectionArgs, null, null, sortOrder); return cursor; } }
结果如下:点击不同的Button,查询不同的表。
相关推荐
简单介绍了android四大组件中最难的contentP人oviDer组件中对于通讯录所在数据库的查询和添加操作。
NULL 博文链接:https://lydia-fly.iteye.com/blog/2025174
Android四大组件之一ContentProvider自定义Sqlite共享,实现增删查改基本功能
四大应用组件之ContentProvider,通过实例讲解_四大应用组件之ContentProvider的应用
自定义ContentProvider的流程 ContentResolver访问通讯录数据库
之前在用到ContentProvider时也是在网上找的教程,但是按照那些做法不怎么全面,我是没有实现出来,并且对于报错也没有给出解释原因与解决办法,也是通过借鉴与自己摸索,将自己 的一点想法分享出来。包含 ...
delphi XE Android四大组件ContentProvider:delphi XE可调用的Android ContentProvider有哪些? delphi XE用Android SDK方法开发App(二) 运用Android四大组件之ContentProvider unit Androidapi.JNI.Provider; ...
Android四大组件之ContentProvider的单元测试
Android四大基本组件介绍与生命周期Android四大基本组件分别是Activity,Service服务,ContentProvider内容提供者,BroadcastReceiver广播接收器。 Android四大基本组件介绍与生命周期 Android四大基本组件分别是...
1. 下面不是Android四大组件之一的( B ) A. Activity B.Intent C. Service D. ContentProvider 2. 下面关于广播叙述错误的是(A) A. 广播是Android四大组件之一 B. BroadcastReceiver有两种注册方式,静态注册...
安卓四大组件 思维导图 使用iThoughs打开 包括 activity service .BroadcastReceiver ContentProvider
Android四大核心组件 Activity、BroadcastReceiver、Service、ContentProvider
ContentProvider为Android四大组件之一,主要用来应用程序之间的数据共享,也就是说一个应用程序用ContentProvider将自己的数据暴露出来,其他应用程序通过ContentResolver来对其暴露出来的数据进行增删改查。...
Android开发四大组件分别是:活动(Activity):用于表现功能。服务(Service):后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver):用于接收广播。内容提供商(ContentProvider):支持在多个应用中存储和...
本项目介绍的是Android中的联系人的项目实战,主要是联系人的获取,新增 ,编辑,删除等功能,主要是练习Android四大组件之ContentProvider的使用和学习。
ContentProvider的demo,Android四大组件之一,亲写,有效,仅供学习参考
ContentProvider是android的四大组件之一,同时与SharedPreferences、IO、SQLite、网络共同构成了五种android存储技术。是android定义的一个管理访问结构化数据机制。android支持的Sqlite是不支持跨进程、跨应用访问...
作为Android的四大组件之一,ContentProvider作为进程之间静态数据传递的重要手段,其在系统级别的应用中起了重大的作用。毫无疑问,ContentProvider核心机制之一也是Binder,但是和其它3大组件又有区别。因为...
文档里边对android组件Activity、Service、BroadcastReceiver、ContentProvider和Intent分析的非常详细,对快速学习android提供很大的帮助。