日拱一卒(十二)

本文详细介绍了Android中的ContentProvider组件,包括内容URI的标准格式、如何创建自己的ContentProvider以实现跨进程的数据共享,以及如何定义URI匹配器并注册ContentProvider。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContentProvider

1.内容URI标准的格式写法(权限+路径):

content://com.example.app.provider/table1
content://com.example.app.provider/table2

   当然也可以具体到表中id:

content://com.example.app.provider/table1/1

2.创建自己的ContentProvider(实现跨进程共享数据)

(1)创建自己的Provider类,实现CRUD

public class MyProvider extends ContentProvider {
	
	@Override
	public boolean onCreate() {
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		return null;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		return 0;
	}
	
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		return 0;
	}
	
	@Override
	public String getType(Uri uri) {
		return null;
	}

}
注:

onCreate():完成对数据库的创建和升级等操作,只有当存在ContentResolver尝试访问我们程序中的数据时,

内容提供器才会被初始化。

getType():据传入的内容URI来返回相应的MIME类型。

2.给自己的Provider创建匹配方式:

public class MyProvider extends ContentProvider {
	
	public static final int TABLE1_DIR = 0;

	public static final int TABLE1_ITEM = 1;

	public static final int TABLE2_DIR = 2;

	public static final int TABLE2_ITEM = 3;

	private static UriMatcher uriMatcher;

	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR);
		uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM);
		uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM);
		uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM);
	}
	……
	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
		switch (uriMatcher.match(uri)) {
		case TABLE1_DIR:
			// 查询table1表中的所有数据
			break;
		case TABLE1_ITEM:
			// 查询table1表中的单条数据
			break;
		case TABLE2_DIR:
			// 查询table2表中的所有数据
			break;
		case TABLE2_ITEM:
			// 查询table2表中的单条数据
			break;
		default:
			break;
		}
		……
	}
	
	@Override
	public String getType(Uri uri) {
		switch (uriMatcher.match(uri)) {
		case TABLE1_DIR:
			return "vnd.android.cursor.dir/vnd.com.example.app.provider. table1";
		case TABLE1_ITEM:
			return "vnd.android.cursor.item/vnd.com.example.app.provider. table1";
		case TABLE2_DIR:
			return "vnd.android.cursor.dir/vnd.com.example.app.provider. table2";
		case TABLE2_ITEM:
			return "vnd.android.cursor.item/vnd.com.example.app.provider. table2";
		default:
			break;
		}
		return null;
	}
	……
}

注:

  (1)在静态代码块里我们创建了UriMatcher的实例,并调用addURI()方法,将期望匹配的内容URI格式传递进去,注意这里传入的路径参数是可以使用通配符的。 (2)getType()方法。它是所有的内容提供器都必须提供的一个方法,用于获取Uri对象所对应的MIME类型。一个内容URI所对应的MIME字符串主要由三部分组分,Android对这三个部分做了如下格式规定。

1. 必须以vnd开头。

2. 如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URIid结尾,则后接android.cursor.item/。

3. 最后接上vnd.<authority>.<path>。

所以,对于content://com.example.app.provider/table1这个内容URI,它所对应的MIME类型就可以写成:
    vnd.android.cursor.dir/vnd.com.example.app.provider.table1
对于content://com.example.app.provider/table1/1这个内容URI,它所对应的MIME类型就可以写成:

           vnd.android.cursor.item/vnd. com.example.app.provider.table1

3.在AndroidManifest.xml中注册:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.databasetest"
    android:versionCode="1"
    android:versionName="1.0" >
	……
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
		……
       <provider
            android:name="com.example.databasetest.DatabaseProvider"
            android:authorities="com.example.databasetest.provider" >
        </provider>
    </application>
</manifest>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值