需求 :有两个应用程序分别是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应用- - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- - - - - - - -
* 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);
}
}
}