ContentProvider例子

在android中,使用ContentProvider的场景比较多,比如:获取联系人,获取手机软件安装目录 ...andr more..

ContentProvider可以比作中间人,更形象的说:A想要用C的数据,但是A没有通道,而B恰好有,所以B就提供了这样一个桥梁,让A可以通过B来和C进行数据的传递和沟通;如果A要使用B的桥梁,那就需要在一个大家都知道的地方放置,所以需要在AndroidManifest.xml配置通信地址"android:authorities"。

下面就开始使用自定义的内容提供者,首先创建自定义的数据库

public class Helper extends SQLiteOpenHelper {
	public static final String TABNAME = "book";
	public static final String ID = "_id";
	public static final String NAME = "name";

	public Helper(Context context) {
		super(context, "cp.db", null, 1);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(" CREATE TABLE " + TABNAME + " (" + ID
				+ " integer primary key autoincrement," + NAME + " TEXT)");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}
}
然后创建内容提供者,也就是中间人(ContentProvicerLogic)让它继承自ContentProvider

public class ContentProvicerLogic extends ContentProvider {
	private Helper helper;
	// 匹配URL
	private static final UriMatcher uri_matcher;
	// 匹配code
	private static final int INSERT = 1;
	private static final int QUERY = 2;
	private static final int QUERYNE = 5;
	private static final int DELETE = 3;
	private static final int UPDATE = 4;
	//主机地址 类似于通信信号道
	private static final String URL = "com.example.contentproviderdemo";

	static {
		uri_matcher = new UriMatcher(UriMatcher.NO_MATCH);
		uri_matcher.addURI(URL, "insert", INSERT);
		uri_matcher.addURI(URL, "query", QUERY);
		uri_matcher.addURI(URL, "queryne", QUERYNE);
		uri_matcher.addURI(URL, "delete", DELETE);
		uri_matcher.addURI(URL, "update", UPDATE);
	}
	//TODO 在初始化时创建数据库实例
	@Override
	public boolean onCreate() {
		helper = new Helper(getContext());
		return false;
	}
	//TODO
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		Cursor cursor;
		if (uri_matcher.match(uri) == QUERY) {
			SQLiteDatabase database = helper.getReadableDatabase();
			cursor = database.query(helper.TABNAME, projection, selection,
					selectionArgs, null, null, null);
		} else if (uri_matcher.match(uri) == QUERYNE) {
			long id = ContentUris.parseId(uri);
			SQLiteDatabase database = helper.getReadableDatabase();
			cursor = database.query(helper.TABNAME, projection, "id=?",
					new String[] { id + "" }, null, null, sortOrder);
		} else {
			throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
		}
		return cursor;
	}
	//TODO 一定要覆写这个方法
	@Override
	public String getType(Uri uri) {
		if (uri_matcher.match(uri) == QUERY) {
			return "vnd.android.cursor.dir/cps";
		} else if (uri_matcher.match(uri) == QUERYNE) {
			return "vnd.android.cursor.item";
		}
		return null;
	}
	//TODO 增加类容
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		if (uri_matcher.match(uri) == INSERT) {
			SQLiteDatabase database = helper.getWritableDatabase();
			long id = database.insert(helper.TABNAME, null, values);
		} else {
			throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
		}
		return null;
	}
	//TODO 删除指定条件的类容
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		long id;
		if (uri_matcher.match(uri) == DELETE) {
			SQLiteDatabase database = helper.getWritableDatabase();
			id = database.delete(helper.TABNAME, selection, selectionArgs);
		} else {
			throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
		}
		return (int) id;
	}
	//TODO 根据条件更新指定的类容
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		long id;
		if (uri_matcher.match(uri) == UPDATE) {
			SQLiteDatabase database = helper.getWritableDatabase();
			id = database.update(helper.TABNAME, values, selection,
					selectionArgs);
		} else {
			throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
		}
		return (int) id;
	}
}
细心留意发现上面代码有个共同的URL,这个URL地址就是A根C通信的桥梁,所以需要再清单文件中注册

<provider
            android:name="com.example.contentproviderdemo.ContentProvicerLogic"
            android:authorities="com.example.contentproviderdemo" >
        </provider>
最后在调用时,只需要根据一定的规则传入数据既可

@Override
	public void onClick(View v) {
		ContentResolver contentResolver = getContentResolver();
		switch (v.getId()) {
		case R.id.button1:
			Uri searchuri = Uri
					.parse("content://com.example.contentproviderdemo/query");
			Cursor cursor = contentResolver.query(searchuri, null, null, null,
					null);
			while (cursor.moveToNext()) {
				Log.i("MyTag", cursor.getString(cursor.getColumnIndex("name")));
			}
			cursor.close();
			break;
		case R.id.button2:
			Uri adduri = Uri
					.parse("content://com.example.contentproviderdemo/insert");
			ContentValues values = new ContentValues();
			values.put("name", "fuck");
			contentResolver.insert(adduri, values);
			break;
		case R.id.button3:
			Uri updateuri = Uri
					.parse("content://com.example.contentproviderdemo/update");
			ContentValues values2 = new ContentValues();
			values2.put("name", "fuck2");
			contentResolver.update(updateuri, values2, "name=?",
					new String[] { "fuck" });
			break;
		case R.id.button4:
			Uri deleteuri = Uri
					.parse("content://com.example.contentproviderdemo/delete");
			contentResolver
					.delete(deleteuri, "name=?", new String[] { "fuck" });
			break;
		}
	}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值