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,查询不同的表。

   
Android四大组件之ContentProvider(三)     Android四大组件之ContentProvider(三)
 
 

      

相关推荐