android 系统之ContentProvider
生活随笔
收集整理的這篇文章主要介紹了
android 系统之ContentProvider
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于上一篇的數據庫操作,又寫了一個ContentProvider的示例。把SQLiter 的數據提供出去供別的項目進行訪問。
這一篇的代碼要求熟悉SQLiter 的API.
首先,我們編寫一個類extents ContentProvider ,重寫他的方法。
?URI 在http 中我們稱為統一資源定位符,就是可以通過uri定位到網絡上某一資源。比方如:http://blog.csdn.net/liuc0317/article/details/6771233,?
http:// 是網終協議,是一個標準和規定。
- public boolean onCreate() {}是在項目首次使用ContentProvider 的時候調用,只會調用一次,適合初始化一些數據。
- public Uri insert(Uri uri, ContentValues values) {} 是否可供外部插入數據,如果需要插入數據就重寫。
- public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {}是否可供外部更新數據,如果需要更新數據就重寫。
- public int delete(Uri uri, String selection, String[] selectionArgs) {}是否可供外部刪除數據,如果需要刪除數據就重寫。
- public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {}是否可供外部查詢數據,如果需要查詢數據就重寫。
- public String getType(Uri uri) {} ?可以獲取到操作的類弄,如果是集合類型就會返回。vnd.android.cursor.dir/ 。如果是單條數據就返回vnd.android.cursor.item/
<application android:icon="@drawable/icon" android:label="@string/app_name">......<provider android:name=".PersonContentProvoider" android:authorities="com.hkrt.providers.personprovider"/> </application> 具體實現如下: PersonContentProvider.javapackage com.hkrt.db;import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri;import com.hkrt.server.PersonHelper; /*** 內容的提供者不一定是數據庫 可以是xml 或是網上資源* 在這里我們需要學習ContentProvider 和ContentUris工具類的使用方法* @author Administrator**/ public class PersonContentProvoider extends ContentProvider {private PersonHelper helper;private static final String TABLENAME="person";private static final String ID="id";private static final UriMatcher MATCHER=new UriMatcher(UriMatcher.NO_MATCH);private static final int PERSONS=1;private static final int PERSON=2;static{MATCHER.addURI("com.hkrt.providers.personprovider", "person", PERSONS);// 配置模式1 person 表中所有的記錄數據MATCHER.addURI("com.hkrt.providers.personprovider", "person/#", PERSON); //配置模式2 person 表中id為指定的數據,# 是指標識}// 允許刪除數據@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = helper.getWritableDatabase();int num=0;switch (MATCHER.match(uri)) {case PERSONS:num=db.delete(TABLENAME, selection, selectionArgs);break;case PERSON:long personId = ContentUris.parseId(uri);String where=ID+"="+personId;num=db.delete(TABLENAME, where, selectionArgs);break;default:throw new IllegalArgumentException("Unkown url:"+uri);}return num;}@Overridepublic String getType(Uri uri) {switch (MATCHER.match(uri)) {case PERSONS:return "vnd.android.cursor.dir/";case PERSON:return "vnd.android.cursor.item/";default:break;}return null;}//允許插入數據@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db =helper.getWritableDatabase();switch (MATCHER.match(uri)) {case 1:long rowid = db.insert(TABLENAME, null, values);return ContentUris.withAppendedId(uri, rowid);default:throw new IllegalArgumentException("Unkown URI:"+uri);}}//ContentProvider 第一次被調用時獲取數據庫的使用權@Overridepublic boolean onCreate() {helper = new PersonHelper(this.getContext());return true;}//允許查詢數據 @Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor;switch (MATCHER.match(uri)) {case PERSONS:cursor = db.query(TABLENAME, projection, selection, selectionArgs, null, null, sortOrder);break;case PERSON:long personId= ContentUris.parseId(uri);String where =ID+"="+personId;if(selection!=null && !"".equals(selection.trim())){where+=selection;}cursor = db.query(TABLENAME, null, where, selectionArgs, null, null, sortOrder);break;default:throw new IllegalArgumentException("Unkown uri:"+uri);}return cursor;}//允許更新數據 //person//person/12 @Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {SQLiteDatabase db =helper.getWritableDatabase();int num=0;switch (MATCHER.match(uri)) {case PERSONS:num =db.update(TABLENAME, values, selection, selectionArgs);break;case PERSON:long personid= ContentUris.parseId(uri);String where=ID +"=" + personid;if(selection!=null && !"".equals(selection.trim())){where+=" and "+selection;}num =db.update(TABLENAME, values, where, selectionArgs);break;default:throw new IllegalArgumentException("Unkown URI:"+uri);}return num;}}
以上的代碼就可以把person 數據表中所有操作,提供出來供別的程序訪問了。 工具類ContentUris 的使用: Uri uri=Uri.parse("content://com.hkrt.providers.personprovider/person"); String rowid="2" Uri uri2=Uri.parse("content://com.hkrt.providers.personprovider/person/2");
- ContentUris.withAppendedId(uri, rowid); // 現在的結果就是com.hkrt.providers.personprovider/person/2
- ContentUris.parseId(uri2);// 那么也在的就結果就是2
經過我的測試沒有問題。我把結果導出后的插圖如下:
注:id為6的新插入的數據,id為2的就新修改的數據。 其他的實現沒有寫。可以類比。
轉載于:https://www.cnblogs.com/java20130726/archive/2011/09/14/3218356.html
總結
以上是生活随笔為你收集整理的android 系统之ContentProvider的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转载 Android解决java.lan
- 下一篇: 伤不起的指针