ContentProvider簡介以及使用實例

ContentProvider 數據庫共享總結

 * Content Provider 屬於Android應用程序的組件之一,作爲應用程序之間唯一的共享數據的途徑,
Content Provider 主要的功能就是存儲並檢索數據以及向其他應用程序提供訪問數據的藉口。
 * 讓自己的數據和其他應用程序共享有兩種方式:創建自己的Content Provier(即繼承自ContentProvider的子類)  
或者是將自己的數據添加到已有的Content Provider中去,後者需要保證現有的Content Provider和自己的數
據類型相同且具有該 Content Provider的寫入權限。對於Content Provider,最重要的就是數據模型(data model)
和 URI。
 * Android應用程序可以使用文件或SqlLite數據庫來存儲數據。Content Provider提供了一種多應用間數據共享的方式,
比如:聯繫人信息可以被多個應用程序訪問。Content Provider是個實現了一組用於提供其他應用程序存取數據的標準方法的類。


 * 應用程序可以在Content Provider中執行如下操作:
查詢數據
修改數據
添加數據
刪除數據


【實例使用步驟】
①:編寫類繼承自SQLiteOpenHelper用於建立數據表,當然若已存在數據表可跳過此步驟
②:建立繼承自ContentProvider的自定義內容提供者類,複寫以下方法
public boolean onCreate(); // 用於獲取數據庫訪問對象


public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String orderBy); // 執行數據庫查詢操作


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); // 執行數據庫更新操作
在該類中通過靜態代碼塊執行對訪問URI的建立和匹配
③:在Mainifest.xml中添加配置,參見源碼
④:每一個應用程序上下文都有一個單獨的ContentResolver,在適當位置通過getContentResolver獲取.
再根據提供的Uri訪問數據庫,執行增刪改查操作。


【源代碼如下:】

/****************************************【源碼】START**************************************************/
// 1. GroupOpenHelper.java

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class GroupOpenHelper extends SQLiteOpenHelper {
	private static GroupOpenHelper instance;
	public static GroupOpenHelper getInstance(Context context) {
		if(instance == null){
			synchronized (GroupOpenHelper.class) {
				instance = new GroupOpenHelper(context, "smsmanager.db", null, 1);
			}
		}
		return instance;
	}


	private GroupOpenHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}

	
	@Override
	public void onCreate(SQLiteDatabase db) {
		// 羣組表
		String sql = "create table groups(_id integer primary key, group_name varchar(30));";
		db.execSQL(sql);
		
		// 關聯關係表
		sql = "create table thread_group(_id integer primary key,group_id integer,thread_id integer);";
		db.execSQL(sql);
	}

	
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
	}

}

// 2.GroupContentProvider.java

import cn.gzu.smsmana.dao.GroupOpenHelper;
import cn.gzu.smsmana.utils.Sms;
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;

/**
 * =========================================================
 * @author Administrator
 * @description TODO 羣組 和 羣組關聯關係 數據表內容提供
 * @since 2014-9-30 下午7:25:27
 * =========================================================
 */
public class GroupContentProvider extends ContentProvider {
	private static final String AUTHORITY = "cn.gzu.smsmana.provider.GroupContentProvider";
	private static final int GROUPS_INSERT = 0;	// 添加到羣組的匹配碼
	private static final int GROUPS_QUERY_ALL = 1;
	private static final int THREAD_GROUP_QUERY_ALL = 2;
	private static final int THREAD_GROUP_INSERT = 3;
	private static final int GROUPS_UPDATE = 4;
	private static final int GROUPS_SINGLE_DELETE = 5;
	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);
		
		// code that is returned when a URI is matched against the given components. Must be positive.
		// content://cn.gzu.smsmana.provider.GroupContentProvider/groups/insert
		// 新建羣組
		uriMatcher.addURI(AUTHORITY, "groups/insert", GROUPS_INSERT);
		
		// content://cn.gzu.smsmana.provider.GroupContentProvider/groups
		// 查詢所有羣組信息
		uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL);

		// content://cn.gzu.smsmana.provider.GroupContentProvider/thread_group
		// 查詢所有關聯關係信息
		uriMatcher.addURI(AUTHORITY, "thread_group", THREAD_GROUP_QUERY_ALL);

		// content://cn.gzu.smsmana.provider.GroupContentProvider/thread_group/insert
		// 插入關聯關係信息
		uriMatcher.addURI(AUTHORITY, "thread_group/insert", THREAD_GROUP_INSERT);

		// content://cn.gzu.smsmana.provider.GroupContentProvider/groups/update
		// 修改羣組信息
		uriMatcher.addURI(AUTHORITY, "groups/update", GROUPS_UPDATE);
		
		// content://cn.gzu.smsmana.provider.GroupContentProvider/groups/delete/#
		// 刪除羣組信息
		uriMatcher.addURI(AUTHORITY, "groups/delete/#", GROUPS_SINGLE_DELETE);
	}
	
	@Override
	public boolean onCreate() {
		mOpenHelper = GroupOpenHelper.getInstance(getContext());
		return false;
	}

	
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String orderBy) {
		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, orderBy);
				// 給遊標結果集設置一個通知的uri 數據改變了, 它會執行重新查詢操作, 更新數據
				cursor.setNotificationUri(getContext().getContentResolver(), Sms.GROUPS_QUERY_ALL_URI);
				return cursor;
			}
			
			break;
		case THREAD_GROUP_QUERY_ALL:  // 查詢所有關聯關係表的內容
			if(db.isOpen()){
				Cursor cursor = db.query(THREAD_GROUP_TABLE, projection,
						selection, selectionArgs, null, null, orderBy);
				return cursor;
			}
			
			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);
				// 通知對應的uri 數據改變了, 它會執行重新查詢操作, 更新數據
				getContext().getContentResolver().notifyChange(Sms.GROUPS_INSERT_URI, null);
				return ContentUris.withAppendedId(uri, id);
			}
			
			break;
		case THREAD_GROUP_INSERT:  // 插入關聯關係表內容
			if(db.isOpen()){
				long id = db.insert(THREAD_GROUP_TABLE, null, values);
				// 將插入id添加到uri 刪除時使用
				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) {
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		switch(uriMatcher.match(uri)){
		case GROUPS_SINGLE_DELETE: // 刪除羣組數據
			if(db.isOpen()){
				// 根據uri獲取到要刪除的項目id
				long id = ContentUris.parseId(uri);
				String where = " _id = " + id;
				// 刪除單個項目
				int count = db.delete(GROUPS_TABLE, where, null);
				
				// 通知對應的uri 數據改變了, 它會執行重新查詢操作, 更新數據
				getContext().getContentResolver().notifyChange(Sms.GROUPS_SINGLE_DELETE_URI, null);
				
				where = "group_id = " + 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) {
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		switch(uriMatcher.match(uri)){
		case GROUPS_UPDATE: // 插入羣組數據
			if(db.isOpen()){
				int count = db.update(GROUPS_TABLE, values, selection, selectionArgs);
				// 通知對應的uri 數據改變了, 它會執行重新查詢操作, 更新數據
				getContext().getContentResolver().notifyChange(Sms.GROUPS_UPDATE_URI, null);
				return count;
			}
			
			break;
		default:
			throw new IllegalArgumentException("UnKnow Uri : " + uri);
		}
		return 0;
	}

}

// 3.Sms.java

package cn.gzu.smsmana.utils;

import android.net.Uri;

public class Sms {
	
	///////////////////////// ContentProvider使用Uri //////////////////////////////////////
	/**
	 * 添加到羣組的uri
	 */
	public static final Uri GROUPS_INSERT_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/groups/insert");
	
	/**
	 * 查詢所有羣組的uri
	 */
	public static final Uri GROUPS_QUERY_ALL_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/groups");
	
	/**
	 * 查詢所有關聯關係表中的內容的uri
	 */
	public static final Uri THREAD_GROUP_QUERY_ALL_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/thread_group");
	
	/**
	 * 添加到關聯關係表的uri
	 */
	public static final Uri THREAD_GROUP_INSERT_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/thread_group/insert");
	
	/**
	 * 更新羣組表的uri
	 */
	public static final Uri GROUPS_UPDATE_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/groups/update");
	
	/**
	 * 刪除羣組的uri(刪除羣組會刪除其所帶的關聯關係)
	 */
	public static final Uri GROUPS_SINGLE_DELETE_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/groups/delete/#");
	
	
}

// 4.manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.gzu.smsmana"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="cn.gzu.smsmana.SmsDetailActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <provider android:name=".provider.GroupContentProvider"
            android:authorities="cn.gzu.smsmana.provider.GroupContentProvider"></provider>
    </application>

</manifest>

// 5.SmsDetailActivity.java

public class SmsDetailActivity extends Activity
{
	//....省略部分代碼
	// 添加數據
	private void createGroup(String groupName) {
		ContentValues values = new ContentValues();
		values.put("group_name", groupName);
		Uri uri = getContentResolver().insert(Sms.GROUPS_INSERT_URI, values);
		if(ContentUris.parseId(uri) >= 0) {
			Toast.makeText(this, "羣組創建成功", 0).show();
		}
	}

	// 刪除數據
	private void deleteGroup(String group_id) {
		
		Uri uri = ContentUris.withAppendedId(Sms.GROUPS_SINGLE_DELETE_URI, Long.valueOf(group_id));
		
		int count = getContentResolver().delete(uri, null, null);
		if(count > 0) {
			Toast.makeText(this, "刪除成功", 0).show();
		} else {
			Toast.makeText(this, "刪除失敗", 0).show();
		}
	}


	// 更新羣組
	private void updateGroup(String group_id, String group_name) {
		ContentValues values = new ContentValues();
		values.put("group_name", group_name);
		String where = "_id = " + group_id;
		int count = getContentResolver().update(Sms.GROUPS_UPDATE_URI, values, where, null);
		if(count > 0) {
			Toast.makeText(this, "修改成功", 0).show();
		} else {
			Toast.makeText(this, "修改失敗", 0).show();
		}
	}

	// 查詢數據
	private void prepareData() {
		CommonAsyncQuery asyncQuery = new CommonAsyncQuery(getContentResolver());
		asyncQuery.startQuery(0, mAdapter, Sms.GROUPS_QUERY_ALL_URI, null, null, null, null);
	}
}

/****************************************【源碼】END**************************************************/


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