android ContentProvider实现资源共享实例

ContentProvider为存储和读取数据提供了统一的接口,使用ContentProvider,应用程序可以实现数据共享,android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。

本实例将SQLite作为存储数据的方式。

Activity代码:

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_content_provider);
		insertButton = (Button) findViewById(R.id.insertButton);
		updateButton = (Button) findViewById(R.id.updateButton);
		deleteButton = (Button) findViewById(R.id.deleteButton);
		queryButton = (Button) findViewById(R.id.queryButton);

		insertButton.setOnClickListener(new InsertListener());
		updateButton.setOnClickListener(new UpdateListener());
		deleteButton.setOnClickListener(new DeleteListener());
		queryButton.setOnClickListener(new QueryListener());
	}

	class InsertListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			ContentValues[] values = new ContentValues[2];
			ContentValues value = new ContentValues();
			value.put(CPMetadata.users.NAME, "张三");
			value.put(CPMetadata.users.AGE, 12);
			values[0] = value;

			value = new ContentValues();
			value.put(CPMetadata.users.NAME, "李四");
			value.put(CPMetadata.users.AGE, 11);
			values[1] = value;
			//多条插入,调用DemoProvider的insert(),每条调用一次,结果返回成功行数
			int count = getContentResolver().bulkInsert(CPMetadata.users.CONTENT_URI, values);
			// 插入单条数据
			// Uri uri =
			// getContentResolver().insert(CPMetadata.users.CONTENT_URI, values);
			// Log.d("ContentProvider", "uri : " + uri);

			Log.d("ContentProvider", "count : " + count);
		}
	}

	class UpdateListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			//要更新的数据
			ContentValues values = new ContentValues();
			values.put(CPMetadata.users.NAME, "赵六");
			values.put(CPMetadata.users.AGE, 22);
			//根据ID更新,ContentUris.withAppendedId() 方法在URI的结尾追加一个1
			Uri uri = ContentUris.withAppendedId(CPMetadata.users.CONTENT_URI, 1);
			int count = getContentResolver().update(uri, values, null, null);
			Log.d("ContentProvider", "update rows : " + count);
		}
	}

	class DeleteListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			//根据ID删除,ContentUris.withAppendedId() 方法在URI的结尾追加一个2
			Uri uri = ContentUris.withAppendedId(CPMetadata.users.CONTENT_URI, 2);
			int count = getContentResolver().delete(uri, null, null);
			Log.d("ContentProvider", "delete rows : " + count);
		}
	}

	class QueryListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			//根据ID查询使用此uri,ContentUris.withAppendedId() 方法在URI的结尾追加一个1
			//Uri uri = ContentUris.withAppendedId(CPMetadata.users.CONTENT_URI, 1);
			//更新和删除数据使用where子句方法同理
			Cursor cursor = getContentResolver().query(CPMetadata.users.CONTENT_URI, null
					, CPMetadata.users.NAME + "=?", new String[]{"张三"}, CPMetadata.users._ID + " desc");
			//根据游标打印查询结果
			while (cursor.moveToNext()) {
				String id = cursor.getString(cursor.getColumnIndex(CPMetadata.users._ID));
				String name = cursor.getString(cursor.getColumnIndex(CPMetadata.users.NAME));
				String age = cursor.getString(cursor.getColumnIndex(CPMetadata.users.AGE));
				Log.d("ContentProvider", "ID : " + id + "  NAME : " + name + "  AGE : " + age);
			}
			cursor.close();
		}
	}

CPMetadata代码:

public class CPMetadata {

	public static final String AUTHORITY = "com.example.olds1_contentprovider.DemoProvider";
	public static final String DATABASE_NAME = "DemoProviderDB";
	public static final int DATABASE_VERSION = 1;

	public static final int CONTENT = 1;
	public static final int CONTENT_ITEM = 2;

	public static final class users implements BaseColumns {
		public static final String TABLE_NAME = "users";
		public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/users");
		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.demoprovider.user";
		public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.demoprovider.user";
		public static final String NAME = "name";
		public static final String AGE = "age";
	}
}

DBHelper代码:

public class DBHelper extends SQLiteOpenHelper{

	public DBHelper(Context context) {
		super(context, CPMetadata.DATABASE_NAME, null, CPMetadata.DATABASE_VERSION);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		StringBuffer sql = new StringBuffer();
		sql.append("create table " + CPMetadata.users.TABLE_NAME + "(");
		sql.append(CPMetadata.users._ID + " integer primary key autoincrement,");
		sql.append(CPMetadata.users.NAME + " varchar(20),");
		sql.append(CPMetadata.users.AGE + " integer);");
		db.execSQL(sql.toString());
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}
}
public class DemoProvider extends ContentProvider {

	private DBHelper helper;
	private SQLiteDatabase db;

	private static final UriMatcher uriMatcher;
	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(CPMetadata.AUTHORITY, CPMetadata.users.TABLE_NAME, CPMetadata.CONTENT);
		uriMatcher.addURI(CPMetadata.AUTHORITY, CPMetadata.users.TABLE_NAME + "/#",
				CPMetadata.CONTENT_ITEM);
	}

	@Override
	public boolean onCreate() {
		helper = new DBHelper(getContext());
		db = helper.getWritableDatabase();
		return true;
	}

	@Override
	public String getType(Uri uri) {
		switch (uriMatcher.match(uri)) {
		case CPMetadata.CONTENT:
			return CPMetadata.users.CONTENT_TYPE;
		case CPMetadata.CONTENT_ITEM:
			return CPMetadata.users.CONTENT_TYPE_ITEM;
		default:
			throw new IllegalArgumentException("unknown URI:" + uri);
		}
	}

	/**
	 * 整理where子句
	 * 条件分为有ID和无ID两种,ID为主键具有唯一性,不用添加其他条件
	 * 无ID则使用传入的条件处理
	 * @param uri
	 * @param selection
	 * @return
	 */
	public String getWhereStr(Uri uri, String selection){
		String whereStr;
		switch (uriMatcher.match(uri)) {
		case CPMetadata.CONTENT:
			whereStr = selection;
			break;
		case CPMetadata.CONTENT_ITEM:
			whereStr = CPMetadata.users._ID + "=" + uri.getPathSegments().get(1);
			break;
		default:
			throw new IllegalArgumentException("unknown URI :" + uri);
		}
		return whereStr;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		long rowid = db.insert(CPMetadata.users.TABLE_NAME, null, values);
		if (rowid > 0) {
			Uri insertUri = ContentUris.withAppendedId(CPMetadata.users.CONTENT_URI, rowid);
			getContext().getContentResolver().notifyChange(insertUri, null);
			Log.d("ContentProvider", "Insert Success  :" + insertUri);
			return insertUri;
		}
		throw new IllegalArgumentException("unknown URI: " + uri);
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int count = 0;
		String  whereStr = getWhereStr(uri, selection);
		Log.d("ContentProvider", "Delete Where  :" + whereStr);
		count = db.delete(CPMetadata.users.TABLE_NAME, whereStr, selectionArgs);
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		int count = 0;
		String  whereStr = getWhereStr(uri, selection);
		Log.d("ContentProvider", "Update Where  :" + whereStr);
		count = db.update(CPMetadata.users.TABLE_NAME, values, whereStr, selectionArgs);
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		Cursor cursor;
		String  whereStr = getWhereStr(uri, selection);
		Log.d("ContentProvider", "Query Where  :" + whereStr);
		cursor = db.query(CPMetadata.users.TABLE_NAME, projection, whereStr, selectionArgs, null, null, sortOrder);
		cursor.setNotificationUri(getContext().getContentResolver(), uri);

		return cursor;
	}

注册ContentProvider,红色部分表示是否允许外部应用访问,必须设置

<span style="color:#4b4b4b;"><provider
            android:name="DemoProvider"
            android:authorities="com.example.olds1_contentprovider.DemoProvider"
            </span><span style="color:#ff0000;">android:exported="true"</span><span style="color:#4b4b4b;">>
        </provider></span>

新建一个test工程,

效果:

Activity代码如下:

private Button button;
	private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button)findViewById(R.id.button);
        textView = (TextView)findViewById(R.id.textView);
        button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String uriStr = "content://com.example.olds1_contentprovider.DemoProvider/users";
				Uri uri = Uri.parse(uriStr);
				Cursor cursor = getContentResolver().query(uri, null, "name=?", new String[]{"张三"}, null);
				StringBuffer show = new StringBuffer();
				//根据游标打印查询结果
				while (cursor.moveToNext()) {
					String id = cursor.getString(cursor.getColumnIndex("_id"));
					String name = cursor.getString(cursor.getColumnIndex("name"));
					String age = cursor.getString(cursor.getColumnIndex("age"));
					show.append("ID : " + id + "  NAME : " + name + "  AGE : " + age + "\n");
				}
				cursor.close();
				textView.setText(show.toString());
			}
		});
    }

完整代码下载地址:

点我下载实例

时间: 2024-11-10 14:25:13

android ContentProvider实现资源共享实例的相关文章

Android基础 : Android ContentProvider

Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例. 参考文章 Android ContentProvider和getContentResolver

Android ContentProvider、ContentResolver和ContentObserver的使用

1.ContentProvider.ContentResolver和ContentObserver ContentProvider是Android的四大组件之一,可见它在Android中的作用非同小可.它主要的作用是:实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限.其实它也只是一个中间人,真正的数据源是文件或者SQLite等. 一个应用实现ContentProvider来提供内容

【FastDev4Android框架开发】RecyclerView完全解析之结合AA(Android Annotations)注入框架实例(三十)

(一).前言: 话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比ListView,GridView之类控件有很多的优点,例如:数据绑定,Item View创建,View的回收以及重用等机制.本系列文章会包括到以下三个部分: RecyclerView控件的基本使用,包括基础,进阶,高级部分,动画之类(点击进入) RecyclerView控件的实战实例(点击进入) RecyclerView控件集合AA

Android与Libgdx入门实例

本文讲解如何实现Android与Libgdx各自的Hello World过程. 1. Android版Hello World 点击Eclipse快捷方式,选择New Android Application,创建project,填写相应名称. 2. 然后一路next,选择默认就ok了. 3. 创建的程序文件模型. 3. 修改界面显示字符串. 4. 选择工程,点击Run As-Android Application,即可. 若无android手机,可以创建模拟器. 选择Window-Android

Android中的消息处理实例与分析

Android中的消息处理实例与分析 摘要 本文介绍了Android中的消息处理机制,给出了Android消息处理中的几个重点类Handler.Message.MessageQueue.Looper.Runnable.Thread的详细介绍,提供了两个消息处理的实例代码,并深入分析了使用Android消息机制应该遵循的几个原则. 阅读本文的收获 在具有java基础的情况下,Android的学习比较轻松,很多人在没有深刻了解Android消息处理机制的背景下,已经能够开发出可用的app,很多人开始

Android微信分享功能实例+demo

Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留言  o(∩_∩)o 哈哈 代码如下: package com.wx; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import a

Android ContentProvider完整案例

ContentData类,提供数据常量: /** * 提供ContentProvider对外的各种常量,当外部数据需要访问的时候,就可以参考这些常量操作数据. * @author HB * */ public class ContentData { public static final String AUTHORITY = "hb.android.contentProvider"; public static final String DATABASE_NAME = "te

android用户界面的教程实例---转自qianqianlianmeng的博客

1.android用户界面之AlarmManager教程实例汇总http://www.apkbus.com/android-48405-1-1.html2.android用户界面之文本编辑教程实例汇总http://www.apkbus.com/android-48414-1-1.html3.android用户界面之EditText教程实例汇总http://www.apkbus.com/android-48430-1-1.html4.android用户界面之按钮(Button)教程实例汇总http

Android事件分发机制实例验证

Android事件分发机制实例验证 欢迎转载,转载请注明原文出处http://blog.csdn.net/lavor_zl/article/details/51198634,谢谢. 事件分发机制的学习主要来自下面两篇博文: Android事件传递机制 Android 编程下 Touch 事件的分发和消费机制 这两篇博文写的非常好,但是看完了这两篇博文还是有一些不理解的地方,缺少一丝明悟.于是亲自写下几种情况的代码,来看事件分发的结果,从而验证事件分发机制.验证完后瞬间有了一种明悟,感觉豁然开朗.