Android四大组件之ContentProvider(三)
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,查询不同的表。