Android中的ContentProvider的学习笔记.

需求 :有两个应用程序分别是com.itheima.contentProvider和com.itheima.otherApp,

     在com.itheima.contentProvider中有个数据库info.db,在数据库中有张表person.需要在otherApp中获得person表中的数据,并且对person表中的数据进行增删改查.

思路 : 要想在其他应用程序中调用本程序中的增,删,改,查方法,那么首先在程序中应该有个ContentProvider类,在该类中定义好增删改查的函数.当otherApp调用  contentProvider中的增删改查方法时,要先发送个Uri来进行判断,如果Uri匹配成功的话,那么就继续执行下面的代码,以此完成对数据库的增删改查.

重点 : 要掌握的主要是otherApp中的思路.因为在实际的开发中,基本上,都是我们写程序来调用其他应用的ContentProvider,来完成对其他应用的增删改查,如: 对获得系统短信的功能就是在调用系统级应用短信中的ContentProvider的增删改查的方法.


- - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- - - - - - -- - - - - - - 先完成com.itheima.contentProvider应用- - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- - - - 


步骤 : 1,,在com.itheima.contentProvider中定义一个类PersonContentProvider继承ContentProvider,并重写insert,delete,update,query几个函数.

   2,在PersonContentProvider类中,定义多个Uri,并且添加到Uri匹配器中,当otherApp发送Uri来时,就用该匹配器中的Uri来进行匹配,以此判断Uri是否正确.

   3,为每个Uri定义好一个匹配成功的码,当进行插入操作时,匹配成功的话,返回对应的成功码,根据该成功码进行插入操作
 * 当进行修改操作时,匹配成功的话,返回相应的成功码,根据该成功码进行修改操作.

   4,因为,Uri的添加要在很早就要完成,所以,干脆将匹配器的创建和Uri的添加放在静态代码块中,在该类加载时就完成这些操作.

   5,在com.itheima.contentProvider的应用中的清单文件中的和Activity同一级节点下:

<provider 
            android:name="com.itheima.contentProvider.provider.PersonContentProvider"
            android:exported="true"
            android:authorities="com.itheima.contentProvider.provider.PersonContentProvider"
          >  

注意 : 1,在android4.2以后,默认的内容提供者是不对外暴露数据的,这里就要将其设置为:android:exported="true"

        2,在有的模拟器下android:authorities=".provider.PersonContentProvider"这样写没错.

但是,在我的模拟器下必须写全称 ,既 android:authorities=“com.itheima.contentProvider.provider.PersonContentProvider”


com.itheima.contentProvider应用中的PerosnContentProvider类中的代码:

public class PersonContentProvider extends ContentProvider {
	static UriMatcher uriMatcher = null;
	//定义一条插入操作的uri
	static String authority = "com.itheima.contentProvider.provider.PersonContentProvider";//定义插入操作的uri的主机名,这个uri是用来添加到匹配器中的
	static int person_insert_code = 1000;//插入操作的uri匹配成功的返回码
	static int person_delete_code = 1001;//删除操作的uri匹配成功的返回码
	static int person_update_code = 1002;//修改操作的uri匹配成功的返回码
	static int person_queryAll_code = 1003;//查询全部的操作的uri匹配成功的返回码
	static int person_queryItem_code = 1004;//查询单条操作的uri匹配成功的返回码
	
	static{
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//在后面进行匹配时,如果匹配失败,返回NO_MATCH码
		//该插入操作的uri的完整形式是 : content://com.itheima.contentProvider.provider.PersonContentProvider/person/insert 
		uriMatcher.addURI(authority, "person/insert", person_insert_code);//将插入操作的uri以及匹配成功码添加到匹配器中,为的就是在后面和传进来的进行插入操作的uri进行匹配判断
		//该修改操作的uri的完整形式是 : content://com.itheima.contentProvider.provider.PersonContentProvider/person/delete
		uriMatcher.addURI(authority, "person/delete", person_delete_code);///将修改操作的uri以及匹配成功码添加到匹配器中
		//uri的完整形式 : com.itheima.contentProvider.provider.PersonContentProvider/person/update
		uriMatcher.addURI(authority, "person/update", person_update_code);
		//因为是查询全部,所以完整的uri是 : com.itheima.contentProvider.provider.PersonContentProvider/person
		uriMatcher.addURI(authority, "person", person_queryAll_code);
		//因为是查询单条,所以完整的uri是 : com.itheima.contentProvider.provider.PersonContentProvider/person/#,必须要用占位符代替
		uriMatcher.addURI(authority, "perosn/#", person_queryItem_code);
	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext(), "info.db");
		SQLiteDatabase db = openHelper.getReadableDatabase();
		Cursor cursor = null;
		switch(uriMatcher.match(uri))
		{
		case 1003://匹配成功的话,并且返回的成功码是1003就走这条路,查询表中的全部信息
			cursor = db.query("person", null, null, null, null, null, null);
			break;
		case 1004://匹配成功的话,并且返回的成功码是1004就走这条路,查询单条语句
			cursor = db.query("perosn", null, selection, selectionArgs, null, null, null);
			break;
		default :
			throw new RuntimeException("传入的Uri不匹配");
		}
		return cursor;
	}

	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		if(uriMatcher.match(uri) == 1000)//传进来的Uri如果匹配的话,就会返回这个成功码 1000
		{
			//开始往数据库的表中插入一条数据
			SQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext(), "info.db");
			SQLiteDatabase db = openHelper.getWritableDatabase();
			db.insert("person", null, values);
			System.out.println("插入数据成功!");
			db.close();
		}else{
			throw new RuntimeException("Uri不匹配");
		}
		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		if(uriMatcher.match(uri) == 1001)//传进来的Uri如果匹配的话,就会返回这个成功码 1001
		{
			//开始从数据库中删除一条或多条数据
			SQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext(), "info.db");
			SQLiteDatabase db = openHelper.getWritableDatabase();
			int i = db.delete("person", selection, selectionArgs);
			System.out.println("删除成功");
			db.close();
			return i ;
		}else{
			throw new RuntimeException("传入的Uri不匹配");
		}
		
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		if(uriMatcher.match(uri) == 1002)//传进来的Uri如果匹配的话,就会返回这个成功码 1002
		{
			//开始从数据库中修改一条或多条数据
			SQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext(), "info.db");
			SQLiteDatabase db = openHelper.getWritableDatabase();
			int  i = db.update("person", values,selection ,selectionArgs);
			db.close();
			return i;
		}else{
			throw new RuntimeException("传入的Uri不匹配");
		}
	}

}


- - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- - - - - - -- - - - - - - 再完成com.itheima.otherApp应用- - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- - - - - - - - 



思路 : 获得一个内容解决者ContentResolver对象, 再准备好Uri,使用ContentResolver对象调用query函数,就将Uri传到com.itheima.contentProvider中的query函数中进行匹配.
实际上是通过Uri的导引,直接调用了ContentProvider中的query函数.
步骤 : 1,获得一个ContentResolver对象
 * 2,准备好Uri对象,用来导引到ContentProvider应用中去.

在com.itheima.otherApp应用中的Test类中的代码 : 

public class Test extends AndroidTestCase {
	//测试往ContentProvider应用中的数据库中的表中插入一条数据
	public void insertTest(){
		ContentResolver resolver = getContext().getContentResolver();
	       Uri uri = Uri.parse("content://com.itheima.contentProvider.provider.PersonContentProvider/person/insert");
	       ContentValues values = new ContentValues();
	       values.put("name", "男模");
	       values.put("age", 22);
	       resolver.insert(uri, values);
	}
	//测试从ContentProvider应用中的数据库中的表中删除一条或多条数据
	public void deleteTest()
	{
		ContentResolver resolver = getContext().getContentResolver();
		Uri uri = Uri.parse("content://com.itheima.contentProvider.provider.PersonContentProvider/person/delete");
		int i = resolver.delete(uri,"id > ?", new String []{"7"});
		System.out.println("删除了 "+i +" 行");
	}
	//测试修改ContentProvider应用中的数据库中的表中的一条数据
	public void updateTest()
	{
		ContentResolver resolver = getContext().getContentResolver();
		Uri uri = Uri.parse("content://com.itheima.contentProvider.provider.PersonContentProvider/person/update");
		ContentValues values = new ContentValues();
		values.put("name", "张胖子");
		values.put("age", 20);
		int i = resolver.update(uri, values, "name = ?", new String [] {"胡汉三"});
		System.out.println("修改了 "+ i + " 行");
	}
	//测试查询ContentProvider应用中的数据库中的表中的所有数据
	public void queryAll()
	{
		ContentResolver resolver = getContext().getContentResolver();
		Uri uri = Uri.parse("content://com.itheima.contentProvider.provider.PersonContentProvider/person");
		Cursor cursor = resolver.query(uri, null, null, null, null);
		if(cursor != null)
		{
			while(cursor.moveToNext())
			{
				int id = cursor.getInt(cursor.getColumnIndex("id"));
				String name = cursor.getString(cursor.getColumnIndex("name"));
				int age = cursor.getInt(cursor.getColumnIndex("age"));
				System.out.println("id  :  "+ id+"  name : "+name +" age : "+age);
			}
		}
		cursor.close();
	}
	//测试查询ContentProvider应用中的数据库中的表中的一条数据
	public void queryItem()
	{
		ContentResolver resolver = getContext().getContentResolver();
		Uri uri = Uri.parse("content://com.itheima.contentProvider.provider.PersonContentProvider/person/#");
		Cursor cursor = resolver.query(uri, null, "id = ?", new String[] {"1"}, null);
		if(cursor.moveToFirst())
		{
			int id = cursor.getInt(cursor.getColumnIndex("id"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			int age = cursor.getInt(cursor.getColumnIndex("age"));
			System.out.println("id  :  "+ id+"  name : "+name +" age : "+age);
		}
	}
}


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值