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程序设计有所帮助。