Android内容提供者ContentProvider用法实例分析
本文实例讲述了Android内容提供者ContentProvider用法。分享给大家供大家参考,具体如下:
PersonContentProvider内容提供者类
packagecom.ljq.db;
importandroid.content.ContentProvider;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.content.UriMatcher;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.net.Uri;
importandroid.text.TextUtils;
/**
*内容提供者
*
*作用:统一数据访问方式,方便外部调用
*
*@authorjiqinlin
*
*/
publicclassPersonContentProviderextendsContentProvider{
//数据集的MIME类型字符串则应该以vnd.android.cursor.dir/开头
publicstaticfinalStringPERSONS_TYPE="vnd.android.cursor.dir/person";
//单一数据的MIME类型字符串应该以vnd.android.cursor.item/开头
publicstaticfinalStringPERSONS_ITEM_TYPE="vnd.android.cursor.item/person";
publicstaticfinalStringAUTHORITY="com.ljq.provider.personprovider";//主机名
/*自定义匹配码*/
publicstaticfinalintPERSONS=1;
/*自定义匹配码*/
publicstaticfinalintPERSON=2;
publicstaticfinalUriPERSONS_URI=Uri.parse("content://"+AUTHORITY+"/person");
privateDBOpenHelperdbOpenHelper=null;
//UriMatcher类用来匹配Uri,使用match()方法匹配路径时返回匹配码
privatestaticfinalUriMatcheruriMatcher;
static{
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
uriMatcher=newUriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.ljq.provider.personprovider/person路径,返回匹配码为PERSONS
uriMatcher.addURI(AUTHORITY,"person",PERSONS);
//如果match()方法匹配content://com.ljq.provider.personprovider/person/230路径,返回匹配码为PERSON
uriMatcher.addURI(AUTHORITY,"person/#",PERSON);
}
@Override
publicbooleanonCreate(){
dbOpenHelper=newDBOpenHelper(this.getContext());
returntrue;
}
@Override
publicUriinsert(Uriuri,ContentValuesvalues){
SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
longid=0;
switch(uriMatcher.match(uri)){
casePERSONS:
id=db.insert("person","name",values);//返回的是记录的行号,主键为int,实际上就是主键值
returnContentUris.withAppendedId(uri,id);
casePERSON:
id=db.insert("person","name",values);
Stringpath=uri.toString();
returnUri.parse(path.substring(0,path.lastIndexOf("/"))+id);//替换掉id
default:
thrownewIllegalArgumentException("UnknownURI"+uri);
}
}
@Override
publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
intcount=0;
switch(uriMatcher.match(uri)){
casePERSONS:
count=db.delete("person",selection,selectionArgs);
break;
casePERSON:
//下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
//进行解析,返回值为10
longpersonid=ContentUris.parseId(uri);
Stringwhere="id="+personid;//删除指定id的记录
where+=!TextUtils.isEmpty(selection)?"and("+selection+")":"";//把其它条件附加上
count=db.delete("person",where,selectionArgs);
break;
default:
thrownewIllegalArgumentException("UnknownURI"+uri);
}
db.close();
returncount;
}
@Override
publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
String[]selectionArgs){
SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
intcount=0;
switch(uriMatcher.match(uri)){
casePERSONS:
count=db.update("person",values,selection,selectionArgs);
break;
casePERSON:
//下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
//进行解析,返回值为10
longpersonid=ContentUris.parseId(uri);
Stringwhere="id="+personid;//获取指定id的记录
where+=!TextUtils.isEmpty(selection)?"and("+selection+")":"";//把其它条件附加上
count=db.update("person",values,where,selectionArgs);
break;
default:
thrownewIllegalArgumentException("UnknownURI"+uri);
}
db.close();
returncount;
}
@Override
publicStringgetType(Uriuri){
switch(uriMatcher.match(uri)){
casePERSONS:
returnPERSONS_TYPE;
casePERSON:
returnPERSONS_ITEM_TYPE;
default:
thrownewIllegalArgumentException("UnknownURI"+uri);
}
}
@Override
publicCursorquery(Uriuri,String[]projection,Stringselection,
String[]selectionArgs,StringsortOrder){
SQLiteDatabasedb=dbOpenHelper.getReadableDatabase();
switch(uriMatcher.match(uri)){
casePERSONS:
returndb.query("person",projection,selection,selectionArgs,null,null,sortOrder);
casePERSON:
//下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
//进行解析,返回值为10
longpersonid=ContentUris.parseId(uri);
Stringwhere="id="+personid;//获取指定id的记录
where+=!TextUtils.isEmpty(selection)?"and("+selection+")":"";//把其它条件附加上
returndb.query("person",projection,where,selectionArgs,null,null,sortOrder);
default:
thrownewIllegalArgumentException("UnknownURI"+uri);
}
}
}
文件清单
<?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.ljq.sql"android:versionCode="1" android:versionName="1.0"> <applicationandroid:icon="@drawable/icon" android:label="@string/app_name"> <uses-libraryandroid:name="android.test.runner"/> <activityandroid:name=".SqlActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <providerandroid:name="com.ljq.db.PersonContentProvider" android:authorities="com.ljq.provider.personprovider"/> </application> <uses-sdkandroid:minSdkVersion="7"/> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.ljq.sql"android:label="TestsforMyApp"/> </manifest>
PersonContentProviderTest内容提供者测试类
packagecom.ljq.test;
importandroid.content.ContentResolver;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.net.Uri;
importandroid.test.AndroidTestCase;
importandroid.util.Log;
/**
*外部访问内容提供者
*
*@authorjiqinlin
*
*/
publicclassPersonContentProviderTestextendsAndroidTestCase{
privatestaticfinalStringTAG="PersonContentProviderTest";
publicvoidtestSave()throwsThrowable{
ContentResolvercontentResolver=this.getContext().getContentResolver();
UriinsertUri=Uri.parse("content://com.ljq.provider.personprovider/person");
ContentValuesvalues=newContentValues();
values.put("name","ljq");
values.put("phone","1350000009");
Uriuri=contentResolver.insert(insertUri,values);
Log.i(TAG,uri.toString());
}
publicvoidtestUpdate()throwsThrowable{
ContentResolvercontentResolver=this.getContext().getContentResolver();
UriupdateUri=Uri.parse("content://com.ljq.provider.personprovider/person/1");
ContentValuesvalues=newContentValues();
values.put("name","linjiqin");
contentResolver.update(updateUri,values,null,null);
}
publicvoidtestFind()throwsThrowable{
ContentResolvercontentResolver=this.getContext().getContentResolver();
//Uriuri=Uri.parse("content://com.ljq.provider.personprovider/person");
Uriuri=Uri.parse("content://com.ljq.provider.personprovider/person");
Cursorcursor=contentResolver.query(uri,null,null,null,"idasc");
while(cursor.moveToNext()){
intpersonid=cursor.getInt(cursor.getColumnIndex("id"));
Stringname=cursor.getString(cursor.getColumnIndex("name"));
Stringphone=cursor.getString(cursor.getColumnIndex("phone"));
Log.i(TAG,"personid="+personid+",name="+name+",phone="+phone);
}
cursor.close();
}
publicvoidtestDelete()throwsThrowable{
ContentResolvercontentResolver=this.getContext().getContentResolver();
Uriuri=Uri.parse("content://com.ljq.provider.personprovider/person/1");
contentResolver.delete(uri,null,null);
}
}
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。