ContentProviderの概要と使用例


ContentProviderデータベース共有の概要
*Content Providerは、Androidアプリケーションのコンポーネントの1つであり、アプリケーション間で唯一データを共有する方法として、Content Providerの主な機能は、データを格納して検索したり、他のアプリケーションにデータにアクセスする口実を提供したりすることです.*独自のデータを他のアプリケーションと共有するには、既存のContent Providerと同じデータ型であり、そのContent Providerの書き込み権限を持つ既存のContent Providerに独自のContent Providerを作成するか、または既存のContent Providerに独自のデータを追加するかの2つの方法があります.Content Providerの場合、最も重要なのはデータモデルとURIです.*Androidアプリケーションでは、ファイルまたはSqlLiteデータベースを使用してデータを格納できます.Content Providerは、連絡先情報が複数のアプリケーションによってアクセスできるなど、複数のアプリケーション間でデータを共有する方法を提供します.Content Providerは、他のアプリケーションがデータにアクセスするための標準的な方法のセットを実現するクラスです.*アプリケーションはContent Providerで次の操作を行うことができます:クエリーデータ修正データ追加データ削除データ【インスタンス使用手順】①:SQLiteOpenHelperからクラスを継承してデータテーブルを作成します.もちろん、データテーブルが存在する場合はこの手順をスキップできます②: ContentProviderから継承されたカスタムコンテンツプロバイダクラスを構築し、以下の方法public boolean onCreate();//データベース・アクセス・オブジェクトpublic Cursor query(Uriuri,String[]projection,String selection,String[]selectionArgs,String orderBy);//データベース照会操作public Uri insert(Uri uri,ContentValue);//データベース追加操作public int delete(Uri uri,String selection,String[]selectionArgs);//データベース削除操作public int update(Uri uri,ContentValue,String selection,String[]selectionArgs);データベース更新操作を実行するこのクラスでは静的コードブロックによりアクセスURIの確立とマッチングを実行する③: Mainifest.xmlに構成を追加するには、ソース④:各アプリケーションコンテキストに個別のContentResolverがあり、適切な場所でgetContentResolverで取得する.さらに、提供されたUriに基づいてデータベースにアクセスし、削除変更操作を実行します.【ソースコードは以下の通り:】
//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



    
    
    
        
            
                

                
            
        
        
        
    


//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**************************************************/