Android内容提供者Provider

安卓ContentProvider与ContentResolver

简介

    在安卓中,ContentProvider(内容提供者)是必不可少的四大组件之一。
    ContentProvider的作用是对外共享数据,通过ContentProvider把应用中的数据传递给其他应用访问。
    内容提供者可以将一些特定的应用程序数据提供给其他的应用程序使用。数据可以存在文件系统,也可以是SQLite数据库等。
    内容提供者继承ContentProivder基类,其他应用程序使用ContentResolver基类来获取到共享数据。
    

ContentProvider共享数据库

    
public class UserInfoContentProvider extends ContentProvider {
	static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

	static int Query_Success = 1;
	static int Insert_Success = 1;
	static int Delete_Success = 1;
	static int Update_Success = 1;

	static {
		uriMatcher.addURI("www.baidu.com.cn", "query", Query_Success);
		uriMatcher.addURI("www.baidu.com.cn", "insert", Insert_Success);
		uriMatcher.addURI("www.baidu.com.cn", "delete", Delete_Success);
		uriMatcher.addURI("www.baidu.com.cn", "update", Update_Success);
	}
	private Helper helper;

	@Override
	public boolean onCreate() {
		helper = new Helper(getContext());
		SQLiteDatabase db = helper.getWritableDatabase();
		db.close();
		return false;
	}

URI可以当作是一种标识符,用于标识主机名或authority("www.baidu.com.cn")。
    
query,insert,delete等等是路径
    
下面的方法是调用数据库
    
	public Uri insert(Uri uri, ContentValues values) {
		int code = uriMatcher.match(uri);
		if (code == Insert_Success) {
			SQLiteDatabase db = helper.getWritableDatabase();
			long insert = db.insert("user", null, values);
			db.close();
			return Uri.parse("id:" + insert);
		}
		return Uri.parse("没有这个东西");
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int code = uriMatcher.match(uri);
		if (code == Delete_Success) {
			SQLiteDatabase db = helper.getWritableDatabase();
			int result = db.delete("user", selection, selectionArgs);
			db.close();
			return result;
		}
		return -1;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int code = uriMatcher.match(uri);
		if (code == Update_Success) {
			SQLiteDatabase db = helper.getWritableDatabase();
			int update = db.update("user", values, selection, selectionArgs);
			db.close();
			return update;
		}
		return -1;
	}

这是一个调用数据库的应用程序,用ContentProvider来提供给其他应用程序使用,最后还要加上注册清单文件上面写上
    
<provider 
            android:name="com.example.sqlite.UserInfoContentProvider"
            android:authorities="www.baidu.com.cn"
            android:exported="true"
            >
        </provider>

这样ContentProvider就写好了。
    

ContentResolver获取提供信息

    
内容提供了之后,就是ContentResolver基类的解析共享了
    
再创建一个android app应用程序,获取ContentProvider的共享SQLite数据库操作
下面就是数据库的增删查改操作,每一个操作基本都一样:
    
获取内容解析者
    Uri标示协议   ------->   content:
    www.baidu.com.cn是主机名或者authority
    insert,delete,update,select是路径
    然后就是使用ContentResolver的对象获取到ContentProvider提供的方法,使用方法操作数据库。
    
	public void button_insert(View v) {
		ContentResolver contentResolver = getContentResolver();
		Uri uri = Uri.parse("content://www.baidu.com.cn" + "/insert");
		ContentValues values = new ContentValues();
		values.put("name", "赵六");
		values.put("tel", "110");
		values.put("deadTime", System.currentTimeMillis());
		Uri insert = contentResolver.insert(uri, values);
		System.out.println("insert:" + insert.toString());
	}

	public void button_delete(View v) {
		ContentResolver contentResolver = getContentResolver();
		Uri uri = Uri.parse("content://www.baidu.com.cn" + "/delete");
		String where = "name=?";
		String[] selectionArgs = { "赵六" };
		int delete = contentResolver.delete(uri, where, selectionArgs);
		System.out.println("delete:" + delete);
	}

	public void button_update(View v) {
		ContentResolver contentResolver = getContentResolver();
		Uri uri = Uri.parse("content://www.baidu.com.cn" + "/update");
		ContentValues values = new ContentValues();
		values.put("tel", "120");
		String where = "name=?";
		String[] selectionArgs = { "赵六" };
		int update = contentResolver.update(uri, values, where, selectionArgs);
		System.out.println("update:" + update);
	}

	public void button_select(View v) {
		ContentResolver contentResolver = getContentResolver();
		Uri uri = Uri.parse("content://www.baidu.com.cn" + "/query");
		String[] progection = { "name", "tel", "deadTime" };
		String selection = "name=?";
		String[] selectionArgs = { "赵六" };
		Cursor cursor = contentResolver.query(uri, progection, selection,
				selectionArgs, null);
		if (cursor != null && cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				String name = cursor.getString(0);
				String tel = cursor.getString(1);
				String deadTime = cursor.getString(2);
				System.out.println(name + ":" + tel + ":" + deadTime);
			}
		}
	}

ContentResolver获取系统共享信息

用ContentResolver还可以获取系统共享的数据,如:短信,信息。
    
	public void button_555(View v) {
		ContentResolver contentResolver = getContentResolver();
		Uri uri = Uri.parse("content://sms" + "/");
		String[] progection = { "address", "body" };
		Cursor cursor = contentResolver
				.query(uri, progection, null, null, null);
		if (cursor != null && cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				String address = cursor.getString(0);
				String body = cursor.getString(1);
				System.out.println(address + ":" + body);
			}
		}
	}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值