Android中的ContentProvider的学习笔记.

来源:互联网 发布:淘宝店铺的公告在哪里 编辑:程序博客网 时间:2024/05/18 00:17

需求 :有两个应用程序分别是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;//定义一条插入操作的uristatic 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/deleteuriMatcher.addURI(authority, "person/delete", person_delete_code);///将修改操作的uri以及匹配成功码添加到匹配器中//uri的完整形式 : com.itheima.contentProvider.provider.PersonContentProvider/person/updateuriMatcher.addURI(authority, "person/update", person_update_code);//因为是查询全部,所以完整的uri是 : com.itheima.contentProvider.provider.PersonContentProvider/personuriMatcher.addURI(authority, "person", person_queryAll_code);//因为是查询单条,所以完整的uri是 : com.itheima.contentProvider.provider.PersonContentProvider/person/#,必须要用占位符代替uriMatcher.addURI(authority, "perosn/#", person_queryItem_code);}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubreturn false;}@Overridepublic 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;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic 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;}@Overridepublic 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不匹配");}}@Overridepublic 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);}}}


    

0 0
原创粉丝点击