自己实现第一个ContentProvider

一、概念及说明

ContentProvider定义:

内容提供者是一个android应用的基础模块,提供内容给这个应用,它们封装数据和提供它给应用通过这个ContentResolver接口,使用ContentProvider可以在不同的应用程序之间共享数据,android为常见的一些数据提供了ContentProvider(视频、音频),ContentProvider使用表的形式来组织数据。

 URI定义:

每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。android所提供ContentProvider都存放在android.provider。


二、实现ContentProvider的过程

1。定义ContentProvider所需要的常量(最主要的是定义CONTENT_URI,CONTENT_URI是Uri类型,事实是通过字符串解析得到)

//定义ContentProvider所需要的常量
public class FirstProviderMetaData {

	// AUTHORIY等于自己的创建ContentProvider类的完全路径
	public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider";

	// 数据库的名称
	public static final String DATABASE_NAME = "FirstProvider.db";

	// BaseColumns有两个字段_id和_count
	public static final class UserTableMetaData implements BaseColumns {
		// 表名
		public static final String TABLE_NAME = "t_user";
		// 访问该ContentProvider的URI
		public static final Uri CONTENT_URI = Uri
				.parse("content://" + AUTHORIY);

		// 表的数据类型
		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users";
		// 一列的数据类型
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/users";

		// 一个字段
		public static final String USER_NAME = "name";

		// 默认排序
		public static final String DEFAULT_SORT_ORDER = "_id desc";
	}
}

2。定义一个类,继承ContentProvider

3。实现query,insert,update,delete,getType和onCreate方法


(1).定义UriMatcher

// 匹配Uri,检查Uri的合法性
	public static final UriMatcher uriMatcher;
	public static final int INCOMING_USER_COLLECTION = 1;
	public static final int INCOMING_USER_SIGNLE = 2;
	static {
		// 创建一个uri树的根结点
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		// 添加uri匹配对,如果这个匹配成功,则code值则会返回。
		uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user",
				INCOMING_USER_COLLECTION);
		uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user/#",
				INCOMING_USER_SIGNLE);

	}

(2).重写getType方法

// 根据传入uri,所回该uri所表示的数据类型
	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		switch (uriMatcher.match(uri)) {
		case INCOMING_USER_COLLECTION:
			return UserTableMetaData.CONTENT_TYPE;
		case INCOMING_USER_SIGNLE:
			return UserTableMetaData.CONTENT_ITEM_TYPE;
		default:
			throw new IllegalArgumentException("Unknown URI" + uri);
		}

	}
(3).创建userProjectMap哈希Map静态对象

public static HashMap<String, String> userProjectMap;
	static {
		userProjectMap = new HashMap<String, String>();
		userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
		userProjectMap.put(UserTableMetaData.USER_NAME,
				UserTableMetaData.USER_NAME);
	}

(4).重写insert方法

// 该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		// rowId是新插入数据的id
		long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
		// 正常插入,-1为出常错误
		if (rowId != -1) {
			// 添加一个id到这个路径的结尾
			Uri insertUserUri = ContentUris.withAppendedId(
					UserTableMetaData.CONTENT_URI, rowId);
			// 得到一个ContentResolver实例.
			ContentResolver cr = this.getContext().getContentResolver();
			// 通辞呈数据改变
			cr.notifyChange(insertUserUri, null);

			return insertUserUri;
		} else {
			throw new SQLException("Failed to insert row into" + uri);
		}
	}
(5).重写query方法

@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		SQLiteQueryBuilder sqb = new SQLiteQueryBuilder();
		switch (uriMatcher.match(uri)) {
		case INCOMING_USER_COLLECTION:
			sqb.setTables(UserTableMetaData.TABLE_NAME);
			sqb.setProjectionMap(userProjectMap);
			break;
		case INCOMING_USER_SIGNLE:
			sqb.setTables(UserTableMetaData.TABLE_NAME);
			sqb.setProjectionMap(userProjectMap);

			String idKey = UserTableMetaData._ID;
			// 1得到path集合
			// 2取它的集合的第2个元素
			// 例如:CONTENT_URI等于content://com.example.firstconent.FirstContentProvider/t_user/id,
			// content://为协议
			// com.example.firstconent.FirstContentProvider为authoriy
			// /t_user/id为path
			String idValue = uri.getPathSegments().get(1);

			sqb.appendWhere(idKey + "=" + idValue);
			break;
		}
		String orderBy = null;
		if (TextUtils.isEmpty(sortOrder)) {
			orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
		} else {
			orderBy = sortOrder;
		}
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		Cursor cursor = sqb.query(db, projection, selection, selectionArgs,
				null, null, orderBy);
		ContentResolver cr = this.getContext().getContentResolver();
		// 通适数据变动
		cursor.setNotificationUri(cr, uri);
		return cursor;
	}

4。在AndroidManifest.xml中声明

<provider
            android:name="com.example.firstcontent.FirstContentProvider"
            android:authorities="com.example.first.firstcontent.FirstContentProvider" >
        </provider>



### 回答1: 我们可以用Android的ContentProvider实现一个联系人应用,比如我们可以使用ContentProvider来访问系统的联系人数据库,并且可以添加、删除或者更新联系人信息。我们可以这样实现:1.定义ContentProvider:public class ContactProvider extends ContentProvider { @Override public boolean onCreate() { // 初始化ContentProvider } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 查询联系人 } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 删除联系人 } ### 回答2: 案例:音乐播放器 1. 首先,我们需要创建一个继承自ContentProvider的类,该类将扮演音乐播放器的数据提供者的角色。我们可以命名为MusicProvider。 2. 在MusicProvider中,我们需要定义一些常量来表示提供的数据的URI、表名等信息。例如,我们可以定义一个URI来表示音乐列表,另一个URI来表示当前播放的音乐等。 3. 在MusicProvider中,我们还需要定义一些数据库操作所需的方法,例如查询、插入、更新和删除。这些方法将根据接收到的URI来执行相应的操作,并返回操作的结果。 4. 在MusicProvider中,我们需要创建一个SQLiteOpenHelper实例来管理数据库的创建和升级。通过重写onCreate方法,我们可以在数据库第一次创建时执行一些初始化操作,例如创建音乐表并插入一些初始数据。 5. 在MusicProvider中,我们还需要重写getType方法来返回所提供数据的MIME类型。这将告诉Android系统该如何处理访问该数据的请求。 6. 在完成MusicProvider的编写后,我们可以在应用的其他组件中使用ContentResolver来和MusicProvider进行交互。通过使用ContentResolver的query、insert、update和delete方法,我们可以向MusicProvider查询、插入、更新和删除数据。 7. 例如,在应用的播放界面中,我们可以使用ContentResolver来查询当前播放的音乐信息,并将其显示在界面上。 8. 同样地,在应用的音乐列表界面中,我们可以使用ContentResolver来查询音乐列表,并将结果显示在列表中。 通过将音乐播放器的数据封装为ContentProvider,我们可以方便地实现数据的共享和访问。不同的应用程序可以通过ContentResolver来访问并操作MusicProvider提供的音乐数据,实现数据的共享和协同工作。此外,通过ContentProvider,我们还可以在不同的应用程序之间实现数据的共享和交互,例如将一个应用的音乐列表分享给其他应用来播放。 ### 回答3: Android ContentProvider是Android中的一种组件,用于在不同应用之间共享数据。一个典型的ContentProvider案例是实现一个联系人的管理应用,它可以让用户查看、添加和编辑联系人信息。 首先,需要创建一个ContentProvider类,继承自android.content.ContentProvider,并实现其中的几个关键方法,如onCreate、query、insert、update和delete等。在这个联系人管理应用中,可以定义一个ContactsProvider类来实现这些方法。 然后,在AndroidManifest.xml文件中注册这个ContentProvider,声明相应的权限和数据表。 在ContactsProvider类中,可以定义联系人的数据库表结构,并在onCreate方法中创建该数据库。可以使用SQLiteOpenHelper类来帮助管理数据库的创建、更新和访问。 query方法用于查询联系人数据,可以通过Uri参数指定需要查询的数据。可以使用ContentResolver来调用这个方法,并在回调方法中处理查询结果。 insert方法用于插入新的联系人数据,可以通过Uri参数指定插入的位置。也需要使用ContentResolver来调用这个方法,并在回调方法中处理插入结果。 update方法用于更新联系人数据,可以通过Uri参数指定需要更新的数据。同样,需要使用ContentResolver来调用这个方法,并在回调方法中处理更新结果。 delete方法用于删除联系人数据,可以通过Uri参数指定需要删除的数据。需要使用ContentResolver来调用这个方法,并在回调方法中处理删除结果。 通过这个联系人管理应用的ContentProvider,其他应用可以通过ContentResolver访问和修改联系人数据。这样,不同的应用程序可以共享同一个联系人数据库,实现联系人数据的统一管理。 总之,Android ContentProvider提供了一种机制,让不同的应用程序可以共享数据。通过上述联系人管理应用的案例,可以更好地理解和使用ContentProvider
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值