Android開發之淺談內容提供者provider的使用

大家新年好。博主剛回到廣州就要各種忙。博主換了份工作,所以昨天一來到廣州就忙着找房子,好在昨晚就已經搞定。時間比較緊迫,這篇文章就直接將如何使用provider了。

內容提供者一般用於進程之間通信,當一個app需要訪問另外一個app的數據庫內容的時候,就需要用到內容提供者。爲了節約時間,博主直接偷懶上代碼了,直接拿博主之前寫過的一個短信項目來上了。

首先,定義一個內容提供者

package com.freedom.intelligencesms.provider;


import com.freedom.intelligencesms.db.GroupOpenHelper;
import com.freedom.intelligencesms.utils.SmsUtils;

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;

public class GroupContentProvider extends ContentProvider {
	//授權地址
	private static final String AUTHORITY = "com.freedom.intelligencesms.provider.GroupContentProvider";
	private static final int GROUPS_INSERT = 0;
	private static final int GROUPS_QUERY_ALL = 1;
	private static final int GROUPS_UPDATE = 2;
	private static final int THREAD_GROUP_INSERT = 3;
	private static final int THREAD_GROUP_QUERY_ALL = 4;
	private static final int THREAD_GROUP_QUERY = 5;
	private static final int GROUPS_DELETE = 6;
	private static UriMatcher uriMatcher;
	private GroupOpenHelper mOpenHelper;
	private final String GROUPS_TABLE = "groups";
	private final String THREAD_GROUP_TABLE = "thread_group";
	
	static {
		//定義一個匹配器
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		
		// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/insert
		uriMatcher.addURI(AUTHORITY, "groups/insert", GROUPS_INSERT);
		
		// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/
		uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL);
		
		// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/update
		uriMatcher.addURI(AUTHORITY, "groups/update", GROUPS_UPDATE);
		
		// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/delete/#
		uriMatcher.addURI(AUTHORITY, "groups/delete/#", GROUPS_DELETE);
		
		// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group/insert
		uriMatcher.addURI(AUTHORITY, "thread_group/insert", THREAD_GROUP_INSERT);
		
		// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group
		uriMatcher.addURI(AUTHORITY, "thread_group", THREAD_GROUP_QUERY_ALL);
		
		// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group/#
		uriMatcher.addURI(AUTHORITY, "thread_group/#", THREAD_GROUP_QUERY);
	}

	@Override
	public boolean onCreate() {
		//拿到數據庫
		mOpenHelper = GroupOpenHelper.getInstance(getContext());
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db = mOpenHelper.getReadableDatabase();
		switch (uriMatcher.match(uri)) {
		case GROUPS_QUERY_ALL:		
			if(db.isOpen()) {
				Cursor cursor = db.query(GROUPS_TABLE, projection, selection, selectionArgs, null, null, sortOrder);
				cursor.setNotificationUri(getContext().getContentResolver(), SmsUtils.GROUPS_QUERY_ALL_URI);
				return cursor;
			}
			break;
		case THREAD_GROUP_QUERY_ALL:
			if(db.isOpen()) {
				return db.query(THREAD_GROUP_TABLE, projection, selection, selectionArgs, null, null, sortOrder);
			}
			break;
		case THREAD_GROUP_QUERY:
			if(db.isOpen()) {
				long id = ContentUris.parseId(uri);
				String where = "_id = " + id;
				if(!TextUtils.isEmpty(selection)) {
					where = selection + " and " + where;
				}
				return db.query(THREAD_GROUP_TABLE, projection, where, selectionArgs, null, null, sortOrder);
			}
			break;
		default:
			throw new IllegalArgumentException("Unknow Uri : " + uri);
		}
		return null;
	}

	@Override
	public String getType(Uri uri) {
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		switch (uriMatcher.match(uri)) {
		case GROUPS_INSERT:		
			if(db.isOpen()) {
				long id = db.insert(GROUPS_TABLE, null, values);
				getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);
				return ContentUris.withAppendedId(uri, id);
			}
			break;
		case THREAD_GROUP_INSERT:		
			if(db.isOpen()) {
				long id = db.insert(THREAD_GROUP_TABLE, null, values);
				return ContentUris.withAppendedId(uri, id);
			}
			break;
		default:
			throw new IllegalArgumentException("Unknow Uri : " + uri);
		}
		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		switch (uriMatcher.match(uri)) {
		case GROUPS_DELETE:
			SQLiteDatabase db = mOpenHelper.getWritableDatabase();
			if(db.isOpen()) {
				long group_id = ContentUris.parseId(uri);
				String where = "_id = " + group_id;
				if(!TextUtils.isEmpty(selection)) {
					where = selection + " and " + where;
				}
				int count = db.delete(GROUPS_TABLE, where, selectionArgs);		
				getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);				
				where = "group_id = " + group_id;
				db.delete(THREAD_GROUP_TABLE, where, null);	
				return count;
			}
			break;
		default:
			throw new IllegalArgumentException("Unknow Uri : " + uri);
		}
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		switch (uriMatcher.match(uri)) {
		case GROUPS_UPDATE:
			SQLiteDatabase db = mOpenHelper.getWritableDatabase();
			if(db.isOpen()) {
				int count = db.update(GROUPS_TABLE, values, selection, selectionArgs);

				getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);
				return count;
			}
			break;
		default:
			throw new IllegalArgumentException("Unknow Uri : " + uri);
		}
		return 0;
	}

}
在清單文件中註冊:

   <provider
            android:name=".provider.GroupContentProvider"
            android:authorities="com.freedom.intelligencesms.provider.GroupContentProvider" >
        </provider>

這樣,一個內容提供者就寫好了。當我們需要調用的時候。

String path = content://sms/
Uri uri = uri.parse(path)

ContentResolver resolver = getContentResolver();


Cursor cursor = resolver.query(uri。。。。。。。)

有時候,我們需要監聽數據庫中對應數據變化的時候,這時就需要用到內容觀察者。也是直接上使用代碼了:

//內容觀察者

ContentResolver resolver = getContentResolver();

resolver.registerContentObserver(uri,true,new MyOberserver(new Handler))

private class Myobserver extends ContentObserver
{
	public MyObserver(Handler handler){
		super(handler)
	}

	//當內容觀察者發現數據庫變化的時候調用這個方法
	//觀察到消息郵箱裏面有一個數據變化時,通知
	public void onChange(boolean selfChange)
	{
		super.onChange(selfChange);
		Uri uri = uri.parse("content://sms");

		ContentResolver resolver = getContentResolver();
	

		Cursor cursor = resolver.query(uri,new String[]{"address","date",""type","body"},null,null,null);//從短信數據庫獲取指定內容
		while(cursor.moverToNext())
		{
			String address = cursor.getString(0)
			......

		}//獲取所有短信信息

		cursor.moveToLast()//指向最後一條短信
		cursor.moveToFirst()//指向最新一條短信		


	}

}


由於準備不充分,時間衝忙,這篇文章寫得不是很好,望大家諒解。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章