java安卓content继承别的类_Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容...

一.什么是ContentProvider?

ContentProvider直译过来就是内容提供者,主要作用就是A应用提供接口给B应用调用数据,和之前介绍的sharedPreference和直接开放文件访问类似,都是共享应用程序数据,不同的是之前的两种文件格式可能完全不同,如可能为xml,txt,sql等等,这里ContentProvider返回的数据格式是统一的,因此应用的更为广泛一点.

二.实例

这里使用的是A应用通过ContentProvider共享数据给B应用.这里A应用用的是前文中的android_db里的person表.B应用是新建的android_content_provider程序.

1.新创建android_content_provider应用程序

1c40f067539fc3ac725cb2c1e7ae5f41.png

4f5cafba81d89d95f73fe9936817af32.png

2.访问android_db共享的数据

创建好了应用程序以后,

/android_content_provider/src/com/example/android_content_provider/ContentProvider.java

packagecom.example.android_content_provider;importandroid.app.Activity;importandroid.content.ContentResolver;importandroid.database.Cursor;importandroid.net.Uri;importandroid.os.Bundle;importandroid.util.Log;public class ContentProvider extendsActivity {private static String tag = "ContentProvider.class";/*** Called when the activity is first created.*/@Overridepublic voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.main);//内容解析者

ContentResolver contentResolver =getContentResolver();

Uri uri= Uri.parse("content://com.amos.android_db.provider.PersonProvider/persons");

Cursor cursor= contentResolver.query(uri, null, null, null, null);while(cursor.moveToNext()){

String name= cursor.getString(cursor.getColumnIndex("name"));int age = cursor.getInt(cursor.getColumnIndex("age"));

System.out.println("name:"+name+" age:"+age);

Log.d(tag,"用户名:"+name+" 年龄:"+age);

}

}

}

3.android_db开放共享数据接口

1)开放一个uri

/android_db/AndroidManifest.xml

package="com.amos.android_db"android:versionCode="1"android:versionName="1.0">

2).定义路径匹配(继承ContentProvider类)

/android_db/src/com/amos/android_db/provider/PersonProvider.java

packagecom.amos.android_db.provider;importandroid.content.ContentProvider;importandroid.content.ContentUris;importandroid.content.ContentValues;importandroid.content.UriMatcher;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importandroid.net.Uri;importandroid.util.Log;importcom.amos.android_db.MyDBHelper;importcom.amos.android_db.dao.Person;importcom.amos.android_db.dao.PersonDao;importjava.util.List;/*** Created by amosli on 14-6-17.*/

public class PersonProvider extendsContentProvider {//创建一个路径识别器//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码,也就是说如果找不到匹配的类型,返回-1

private static final UriMatcher uriMatcher = newUriMatcher(UriMatcher.NO_MATCH);private static final int ALL_PERSON = 1;private static final int PERSON = 2;private static final int OTHER = 3;private static String tag="PersonProvider.class";static{//1.指定一个路径的匹配规则//如果路径满足content://com.amos.android_db.provider.PersonProvider/persons,返回值就是(ALL_PERSON)=1

uriMatcher.addURI("com.amos.android_db.provider.PersonProvider","persons",ALL_PERSON);//2.如果路径满足content://com.amos.android_db.provider.PersonProvider/person/3,返回值就是(PERSON)=2//#号为通配符

uriMatcher.addURI("com.amos.android_db.provider.PersonProvider","person/#",PERSON);//3.如果路径满足content://com.amos.android_db.provider.PersonProvider/other,返回值就是(OTHER)=3

uriMatcher.addURI("com.amos.android_db.provider.PersonProvider","other",OTHER);

}/*** 一般是对象第一次被创建时调用的方法

*

*@return

*/@Overridepublic booleanonCreate() {return false;

}/*** 让别人去调用返回结果

*

*@paramuri

*@paramprojection 选择的列

*@paramselection 查询条件

*@paramselectionArgs 查询条件的value

*@paramsortOrder 排序

*@return

*/@OverridepublicCursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {int result =uriMatcher.match(uri);switch(result){//如果路径满足content://com.amos.android_db.provider.PersonProvider/persons,返回值就是(ALL_PERSON)=1

caseALL_PERSON:

PersonDao dao= new PersonDao(this.getContext());returndao.findAllByCursor();//2.如果路径满足content://com.amos.android_db.provider.PersonProvider/person/3,返回值就是(PERSON)=2

casePERSON:long id =ContentUris.parseId(uri);

SQLiteDatabase database= new MyDBHelper(this.getContext()).getReadableDatabase();if(database.isOpen()){

database.execSQL("select * person where personid = "+id);return database.query("person", null, "personid", new String[]{id + ""}, null, null, null);//不要关闭数据库,否则就没有数据了.

}caseOTHER:

Log.d(tag,"我是其他匹配规则!");break;default:throw new RuntimeException("出错了!!");

}return null;

}

@OverridepublicString getType(Uri uri) {return null;

}

@OverridepublicUri insert(Uri uri, ContentValues values) {return null;

}

@Overridepublic intdelete(Uri uri, String selection, String[] selectionArgs) {return 0;

}

@Overridepublic intupdate(Uri uri, ContentValues values, String selection, String[] selectionArgs) {return 0;

}

}

4.效果图

首先,将android_db部署到avd上,其次,运行android_content_provider项目,最后,查看log输出.

11b3118e05868d3dc633dfe8118cb871.png

8c2d26e72f84bbd7e4a253e62a2719fe.png

5.出现的问题

1).报空指针错误

.....

at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.NullPointerException

at com.example.android_content_provider.ContentProvider.onCreate(ContentProvider.java:21)

at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

.....

这种问题很有可能是路径名称不对,注意提供的接口名称保持一致;并且保证获取数据的接口是正常的,即android_db里获取person表的内容是正常的.

2).intelij中的logcat中看不到log

b6041dc534bd4bf5997328dd8f90db33.png

注意选择Android--->选择要查看Log的进程--->点击上面的双向箭头进行切换日志展示信息.

6.扩展

1),查询,增加,删除,修改的接口全部实现

上面已经实现了查询的接口,这里将实现另外三个接口:

//4.插入数据,如果路径满足content://com.amos.android_db.provider.PersonProvider/insert,返回值就是(INSERT)=4

uriMatcher.addURI("com.amos.android_db.provider.PersonProvider", "insert", INSERT);//5.删除数据,如果路径满足content://com.amos.android_db.provider.PersonProvider/delete,返回值就是(DELETE)=5

uriMatcher.addURI("com.amos.android_db.provider.PersonProvider", "delete", DELETE);//6.更新数据,如果路径满足content://com.amos.android_db.provider.PersonProvider/update,返回值就是(UPDATE)=6

uriMatcher.addURI("com.amos.android_db.provider.PersonProvider", "update", UPDATE);

对应的实现:

@OverridepublicUri insert(Uri uri, ContentValues values) {//content://com.amos.android_db.provider.PersonProvider/insert

int result =uriMatcher.match(uri);switch(result) {caseINSERT:

SQLiteDatabase database=myDBHelper.getWritableDatabase();if(database.isOpen()) {

database.insert("person", null, values);

}returnuri;default:throw new RuntimeException("无法识别该URI,出错了!!");

}

}

@Overridepublic intdelete(Uri uri, String selection, String[] selectionArgs) {//删除操作//content://com.amos.android_db.provider.PersonProvider/delete

int result =uriMatcher.match(uri);switch(result) {caseDELETE:

SQLiteDatabase database=myDBHelper.getWritableDatabase();return database.delete("person", selection, selectionArgs);default:throw new RuntimeException("无法识别该URI,出错了!!");

}

}

@Overridepublic intupdate(Uri uri, ContentValues values, String selection, String[] selectionArgs) {//更新操作//content://com.amos.android_db.provider.PersonProvider/update

int result =uriMatcher.match(uri);switch(result) {caseUPDATE:

SQLiteDatabase database=myDBHelper.getWritableDatabase();return database.update("person", values, selection, selectionArgs);default:throw new RuntimeException("无法识别该URI,出错了!!");

}

}

//返回值的类型

@OverridepublicString getType(Uri uri) {int result =uriMatcher.match(uri);switch(result){caseALL_PERSON:return "List";casePERSON:return "Person";default:return null;

}

}

2)测试

AndroidManifest.xml

加入加粗的两行,配置好测试的环境.

/ContentProviderTest/src/com/example/ContentProviderTest/test/TestCase.java

packagecom.example.ContentProviderTest.test;importandroid.content.ContentResolver;importandroid.content.ContentValues;importandroid.net.Uri;importandroid.test.AndroidTestCase;/*** Created by amosli on 14-6-19.*/

public class TestCase extendsAndroidTestCase {public voidtestInsert(){

ContentResolver contentResolver=getContext().getContentResolver();

Uri uri= Uri.parse("content://com.amos.android_db.provider.PersonProvider/insert");

ContentValues values= newContentValues();

values.put("name", "bill");

values.put("age", 18);

contentResolver.insert(uri, values);

}public voidtestDelete(){

ContentResolver contentResolver=getContext().getContentResolver();

Uri uri= Uri.parse("content://com.amos.android_db.provider.PersonProvider/delete");

contentResolver.delete(uri,"name=?",new String[]{"amos96"});

}public voidtestUpdate(){

ContentResolver contentResolver=getContext().getContentResolver();

Uri uri= Uri.parse("content://com.amos.android_db.provider.PersonProvider/update");

ContentValues contentValues= newContentValues();

contentValues.put("name","jack");

contentValues.put("age",30);

contentResolver.update(uri,contentValues,"name=?",new String[]{"amos97"});

}

}

3)效果图:

插入数据(insert方法),bill

c3255da5245b6d2e4351f2bfcd437029.png

删除数据(delete方法),amos96

e971792b3f9709534975cd006d44999d.png

更新数据(update方法 ),amos97

39837b01096b3e0a61592d2610c402f5.png

本文源码:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值