- Android內容提供者源碼,我不想說多,只講一些實用的代碼,增刪改查。通過contentProvider向數據進行操作。大家可以下載,通過日誌與LogCat打印出來的信息作爲參考!
- package com.smart;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.util.Log;
- public class ContentProvider extends Activity {
- private static final String TAG = "ContentProvider";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 通過這個類,方問DB項目
- ContentResolver contentResolver = this.getContentResolver();
- Uri alluri = Uri.parse("content://com.smart.provider.personprovider/person");
- // Uri uri = Uri.parse("content://com.smart.provider.personprovider/person");
- ContentValues values = new ContentValues();
- values.put("name", "smart99"); // 這裏更改就可以了。/
- values.put("age", (short)44);
- // contentResolver.insert(uri, values); //增加
- Uri uri = Uri.parse("content://com.smart.provider.personprovider/person/5");
- // contentResolver.update(uri, values, null, null);//更新
- // contentResolver.delete(uri, null, null);//刪除
- //查詢
- // Cursor cursor = contentResolver.query(uri, new String[] {
- // "personid", "name", "age" }, null, null, "personid desc");
- // while (cursor.moveToNext()) {
- // Log.i(TAG,
- // "personid=" + cursor.getInt(0) + ",name="
- // + cursor.getString(1) + ",age="
- // + cursor.getShort(2));
- // }
- // cursor.close();
- // 記得要關掉數據
- //01:19
- contactMethod();
- }
- //讀取通迅裏的人員。
- public void contactMethod(){
- //聯繫人,/媒體庫/
- ContentResolver contentResolver = this.getContentResolver();
- Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
- while (cursor.moveToNext()) {
- int contactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
- String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
- Log.i(TAG,"contactId=" + contactId + ",name="
- + name);
- Cursor phones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
- null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null);
- StringBuffer sb=new StringBuffer();
- while(phones.moveToNext()){
- String phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- sb.append(phoneNumber).append(",");
- }
- //電話號碼可以得到
- Log.i(TAG, sb.toString());
- }
- cursor.close();
- }
- }
- package com.smart.dh;
- 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 android.text.TextUtils;
- import com.smart.service.DataBaseOpenHelper;
- /**
- * 使用內容提供者
- ContentProvider共享數據
- 當應用繼承ContentProvider類,並重寫該類用於提供數據和存儲數據的方法
- 就可以向其它應用共享其數據。雖然使用其它方法對外共享數據,但是數據訪問
- 方式 會因數據存儲的方式而不同。,而採用文件操作讀寫數據,採用sharedoreferences共享數據的需要使用sharedpreferences API讀寫數據,而使用ContentProvider共享數據的好處
- 好處是統一了數據訪問方式,當應用需要通過ContentProvider對外共享 數據時,第一步需要繼承ContentProvider並重寫下面的方法。
- Public class PersonContentProvider extends ContentProvider{
- Public boolean onCreate();
- Public Uri insert(Uri uri,ContentValues values);
- Public int delete(Uri uri,String selection,String[] selectionArgs);
- Public int update(Uri uri,ContentValues values,String selection,String selectionArgs);
- Pullic Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String softOrder);
- Public String getType(Uri uri);
- }
- 第二步需要在AndroidMandifest.xml使用<provider>對該ContentProvider進行配置,爲了能讓其它應用找到該ContentProvider,ContentProvider採用了authorites(主機名、域名)對它進行唯一標識,你可以把ContentProvider看作是一個網站(想想,網站也是提供數據者),authorites就是他的域名:
- 下面是在要註冊信息
- <appli…>
- <provider android:name=”.類名” android:authorities=”con.smart.provider.包名”>
- </appli>
- 注意:一旦應用繼承了ContentProvider類,後面我們就會把這個應用稱爲ContentProvider內容提供者
- * ContentProvider來自於文件與數據庫都可以
- *
- * Uri介紹
- * Uri代表了要操作的數據,Uri主要包含了兩部信息:1》
- * 需要操作的ContentProvider,2>
- * 對ContentProvider中的,什麼數據進行操作, 一個Uri由以下幾個部分組成。
- * content:// com.smart.provider.personperovider/person/988
- * content:// 指 scheme
- * om.smart.provider.personperovider指 主機名或authority
- * person 指路徑
- * 988 指ID
- * */
- public class PersonContentProvider extends ContentProvider {
- // 另一個工程,方問這一個類。
- private DataBaseOpenHelper dbOpenHelper;
- private static final int ALLPERSON = 1;
- private static final int PERSON = 2;
- private static UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 任何不匹配的時候,返回爲-1
- static {
- //
- sMatcher.addURI("com.smart.provider.personprovider", "person",ALLPERSON);
- sMatcher.addURI("com.smart.provider.personprovider", "person/#", PERSON);
- }
- //刪除
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- int count = 0;// 返回的行數
- switch (sMatcher.match(uri)) {
- case ALLPERSON:
- count = db.delete("person", selection, selectionArgs);
- break;
- case PERSON:
- long personid = ContentUris.parseId(uri);
- String where = TextUtils.isEmpty(selection) ? "personid=?"
- : selection + " and personid=?";
- String[] params = new String[] { String.valueOf(personid) };
- if (!TextUtils.isEmpty(selection) && selectionArgs != null) {
- params = new String[selectionArgs.length + 1];
- for (int i = 0; i < selectionArgs.length; i++) {
- params[i] = selectionArgs[i];
- }
- params[selectionArgs.length + 1] = String.valueOf(personid);
- }
- count = db.delete("person", where, params);
- break;
- default:
- throw new IllegalArgumentException("Unkow Uri:" + uri);
- }
- return count;
- }
- /**
- * public String getType(Uri uri)
- * 方法用於返回URI所代表數據的MIME類型,如果操作的數據發球集合類型,哪麼MIME類型
- * 字符串應該以vnd.android.cursor.dir/開頭,要得到所有的person記錄Uri爲,
- * ontent//com.smart.domain/person 哪麼返回MIME類型字符串應該爲,
- * vnd.android.cursor.item/開頭,比如,得到的ID爲1的person記錄,URI爲
- * ontent//com.smart.domain/person/10 ,哪麼返回的MIME類型字符串應該爲
- * vnd.android.cursor.item/person
- * */
- // 操作數據類型
- @Override //這個方法,不實現也可以的。
- public String getType(Uri uri) {
- switch (sMatcher.match(uri)) {
- case ALLPERSON:
- //多條
- return "vnd.android.cursor.dir/personprovider.person";
- case PERSON:
- //personprovider.person 內容提供表的
- //單條
- return "vnd.android.cursor.item/personprovider.person";
- default:
- throw new IllegalArgumentException("Unkow Uri:" + uri);
- }
- }
- /**
- * UriMatcher類的使用介紹 因爲URI代表了要操作的數據,所以我們很經常需要解析URI,並從URI中獲得取數據,ANDROID系統
- * 提供了兩個用於操作URI的工具類,分別爲URIMATCHER和CONTENTURIS。掌握它們的使用,會便於我們的開發工作,
- * URIMATCHER類於匹配URI。它的用法如下。 首先第一步把你需要匹配路徑全部給註冊上,如下 常量
- * UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼 Urimatcher sMatcher=new
- * UriMatcher(UriMatcher.NO_MATCH);
- * 如果match()方法匹配content//com.smart.domain/person 路徑,返回匹配爲1
- * sMatcher.addURI(content//com.smart.domain/person/1);
- * 如果match()方法匹配content//com.smart.domain/person/230 路徑,返回匹配爲2
- * sMatcher.addURI(content//com.smart.domain/person/#,2); /#爲通配符
- *
- * 這裏講一下,parse方法爲任何的一個字符串轉換爲Uri地址
- * switch(sMatcher.match(Uri.parse("content//com.smart.domain/person/10"))){
- *
- * }
- *
- *
- * 註冊完需要匹配的URI後,就可以使用sMatcher.match(Uri)方法對輸入進行匹配 ,如果匹配就返回匹配碼
- * 匹配碼是調用ADDRUI()方法傳入第三個參數,假設匹配 content//com.smart.domain/person 路徑,返回的匹配碼爲1
- *
- * **/
- //增加
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- // 返回的類型爲,返回一路徑,
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- long id = 0;
- // com.smart.domain/person/100
- switch (sMatcher.match(uri)) {
- case ALLPERSON:
- // com.smart.domain/person/
- id = db.insert("person", "name", values);// 記是記錄的行號,主健INT類,就是主健,
- return ContentUris.withAppendedId(uri, id);
- case PERSON:
- // com.smart.domain/person/20
- db.insert("person", "name", values);
- String path = uri.toString();
- // 從0個開始,取到,com.smart.domain/person/20 前面20的一個'/'
- return Uri.parse(path.substring(0, path.lastIndexOf('/')) + id);
- default:
- // 返回一個參數
- throw new IllegalArgumentException("Unkow Uri:" + uri);
- }
- }
- @Override
- public boolean onCreate() {
- dbOpenHelper = new DataBaseOpenHelper(this.getContext());
- return true;
- }
- //查詢
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- switch (sMatcher.match(uri)) {
- case ALLPERSON:
- return db.query("person", projection, selection, selectionArgs,null,null,sortOrder);
- case PERSON:
- long personid = ContentUris.parseId(uri);
- String where = TextUtils.isEmpty(selection) ? "personid=?"
- : selection + " and personid=?";
- String[] params = new String[] { String.valueOf(personid) };
- if (!TextUtils.isEmpty(selection) && selectionArgs != null) {
- params = new String[selectionArgs.length + 1];
- for (int i = 0; i < selectionArgs.length; i++) {
- params[i] = selectionArgs[i];
- }
- params[selectionArgs.length + 1] = String.valueOf(personid);
- }
- return db.query("person", projection, where, params,null,null,sortOrder);
- default:
- throw new IllegalArgumentException("Unkow Uri:" + uri);
- }
- }
- //更新
- @Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- int count = 0;// 返回的行數
- switch (sMatcher.match(uri)) {
- case ALLPERSON:
- count = db.update("person", values, selection, selectionArgs);
- break;
- case PERSON://com.smart.domain/100
- long personid = ContentUris.parseId(uri);//得到100的記錄
- //判斷是否爲空,爲條件
- String where = TextUtils.isEmpty(selection) ? "personid=?"
- : selection + " and personid=?";
- String[] params = new String[] { String.valueOf(personid) };
- if (!TextUtils.isEmpty(selection) && selectionArgs != null) {
- params = new String[selectionArgs.length + 1];
- for (int i = 0; i < selectionArgs.length; i++) {
- params[i] = selectionArgs[i];
- }
- params[selectionArgs.length + 1] = String.valueOf(personid);
- }
- count = db.update("person", values, where, params);
- break;
- default:
- throw new IllegalArgumentException("Unkow Uri:" + uri);
- }
- return count;
- }
- /*****
- * 增加 ContentUris類用於獲取Uri 路徑後面的ID部分,它有兩個實用的方法,
- * withAppendedld(Uri,id)用於爲路徑爲上ID部分 Uri
- * uri=Uri.parse("content://com.smart.domain/person"); Uri
- * resultUri=ContentUris.withAppendedld(uri,10)
- * 生成後Uri爲:content://com.smart.domain/person/10
- *
- * 更新的方法 parseld(uri)方法用於從路徑中獲取ID部分 Uri
- * uri=Uri.parse("com.smart.domain/person/10"); long
- * personid=ContentUris.parseld(uri);//獲取的結果爲10
- *
- *
- * **/
- }
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.smart.dh"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <uses-library android:name="android.test.runner"/>
- <provider android:name=".PersonContentProvider"
- android:authorities="com.smart.provider.personprovider"
- android:permission="com.smart.provider.personprovider"/>
- <activity android:name=".DBActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="8" />
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.smart.dh" android:label="Tests for My App"/>
- </manifest>
- <!-- android:permission="cn.itcast.provider.personprovider"
- 這行是指權限 android:permission="com.smart.domain"
- com.smart.domain
- -->
大家記住了,兩個工程,一定都導進來,然後運行。