日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

android 系统之ContentProvider

發布時間:2023/12/9 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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/
重寫這么方法后需要填寫一個可以精確定位到此ContentProvider 的聲明:
<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
再下來我們測試我寫的代碼是否正確,我們需要使用androidTestCase 進行測試,測試環境還需要搭建。 我在其他的項目中新建了一個類進行對ContentProvider 的代碼進行測試。實現代碼如下: package com.hkrt;import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.net.Uri; import android.test.AndroidTestCase; import android.util.Log;public class ContentProviderTest extends AndroidTestCase {String TAG="ContentProviderTest";// 測試訪問ContentProvider 插入數據 public void testAccessContentProvider() throws Throwable{Uri uri = Uri.parse("content://com.hkrt.providers.personprovider/person");ContentResolver resolver = this.getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "宋江");Uri url = resolver.insert(uri, values);Log.i(TAG, url.toString());}//測試訪問ContentProvider 更新數據public void updateContentProvider() throws Throwable{Uri uri = Uri.parse("content://com.hkrt.providers.personprovider/person/2");ContentResolver resolver = this.getContext().getContentResolver();long personId = ContentUris.parseId(uri);String where ="id=?";ContentValues values = new ContentValues();values.put("name", "劉成");String [] result ={String.valueOf(personId)};int rowid = resolver.update(uri, values, where, result);Log.i(TAG, String.valueOf(rowid));}}
經過我的測試沒有問題。我把結果導出后的插圖如下:

注:id為6的新插入的數據,id為2的就新修改的數據。 其他的實現沒有寫。可以類比。

轉載于:https://www.cnblogs.com/java20130726/archive/2011/09/14/3218356.html

總結

以上是生活随笔為你收集整理的android 系统之ContentProvider的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。