简单通用的ContentProvider

常用简单的ContentProvider的实现差不多,整理了个通用的(基于com.example.android.supportv4.app.LoaderThrottleSupport.SimpleProvider修改), 从这个类继承,再重写几个方法就可以了,测试代码见附件。

 

 

import java.util.HashMap;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.BaseColumns;
import android.support.v4.database.DatabaseUtilsCompat;
import android.text.TextUtils;

/**
 * 
 * @author J
 *
 */
public abstract class SimpleContentProvider extends ContentProvider{

    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.%s.%s";
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.%s.%s";

    private final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 

    //
    private HashMap<Integer, String> hash_id_tableName = new HashMap<Integer, String>();

    private SQLiteOpenHelper mOpenHelper;
    
    protected abstract String getAuthority();    
    protected abstract SQLiteOpenHelper createDatabaseHelper(Context context);
    protected abstract String[] getTableNames();
    
    protected String getIdName(String tableName){
    	return BaseColumns._ID;
    }
    protected String getDefaultSort(String tableName){
    	return null;
    }
    
    /**
     * If URI is main table
     */
    private boolean isMain(int id){
    	return id % 2 == 1;
    }
    
    /**
     * Global provider initialization.
     */
    public SimpleContentProvider() {
        
        int id_main = 1, id_row = 2;
        String[] tableNames = getTableNames();
        for (String tableName : tableNames){
        	//奇数 for main table, 偶数 for row
        	mUriMatcher.addURI(getAuthority(), tableName, id_main);
        	mUriMatcher.addURI(getAuthority(), tableName + "/#", id_row);
        	
        	hash_id_tableName.put(id_main, tableName);        	        	
        	hash_id_tableName.put(id_row, tableName);
        	
        	id_main += 2;
        	id_row += 2;
        }
    }

    @Override
    public boolean onCreate() {
        mOpenHelper = createDatabaseHelper(getContext());
     
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {

        // Constructs a new query builder and sets its table name
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        
        int id = mUriMatcher.match(uri);        
        String tableName = hash_id_tableName.get(id);        
        if (tableName != null){
        	
        	qb.setTables(tableName);
        	
        	if (isMain(id)){
        		//qb.setProjectionMap(mNotesProjectionMap);
        	}
        	else{
        		//qb.setProjectionMap(mNotesProjectionMap);
                qb.appendWhere(getIdName(tableName) + "=?");
                selectionArgs = DatabaseUtilsCompat.appendSelectionArgs(selectionArgs,
                        new String[] { uri.getLastPathSegment() });                        		
        	}
        }
        else{
        	throw new IllegalArgumentException("Unknown URI " + uri);	
        }
        
        if (TextUtils.isEmpty(sortOrder)) {        	
            sortOrder = getDefaultSort(tableName);
        }

        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);

        c.setNotificationUri(getContext().getContentResolver(), uri);
        
        return c;
    }

    /**
     * Return the MIME type for an known URI in the provider.
     */
    @Override
    public String getType(Uri uri) {
    	int id = mUriMatcher.match(uri);
    	String tableName = hash_id_tableName.get(id);
    	if (tableName != null){
    		if (isMain(id)){
    			return String.format(CONTENT_TYPE, getAuthority(), tableName);
    		}
    		else{
    			return String.format(CONTENT_ITEM_TYPE, getAuthority(), tableName);
    		}
    	}
    	else{
    		throw new IllegalArgumentException("Unknown URI " + uri);
    	}
    	
    }

    /**
     * Handler inserting new data.
     */
    @Override
    public Uri insert(Uri uri, ContentValues initialValues) {
    	int id = mUriMatcher.match(uri);
    	String tableName = hash_id_tableName.get(id);
    	
    	if (tableName == null || !isMain(id)){
            // Can only insert into to main URI.
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        ContentValues values;

        if (initialValues != null) {
            values = new ContentValues(initialValues);
        } else {
            values = new ContentValues();
        }

        SQLiteDatabase db = mOpenHelper.getWritableDatabase();

        long rowId = db.insert(tableName, null, values);

        // If the insert succeeded, the row ID exists.
        if (rowId > 0) {
            //Uri noteUri = ContentUris.withAppendedId(MainTable.CONTENT_ID_URI_BASE, rowId);
        	Uri noteUri = ContentUris.withAppendedId(uri, rowId);
            getContext().getContentResolver().notifyChange(noteUri, null);
            return noteUri;
        }

        throw new SQLException("Failed to insert row into " + uri);
    }

    /**
     * Handle deleting data.
     */
    @Override
    public int delete(Uri uri, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        String finalWhere;

        int count;
        
    	int id = mUriMatcher.match(uri);
    	String tableName = hash_id_tableName.get(id);
    	if (tableName != null){
    		if (isMain(id)){
    			count = db.delete(tableName, where, whereArgs);
    		}
    		else{
                finalWhere = DatabaseUtilsCompat.concatenateWhere(
                		getIdName(tableName) + " = " + ContentUris.parseId(uri), where);
                count = db.delete(tableName, finalWhere, whereArgs);    			
    		}
    	}
    	else{
    		throw new IllegalArgumentException("Unknown URI " + uri);
    	}

        getContext().getContentResolver().notifyChange(uri, null);

        return count;
    }

    /**
     * Handle updating data.
     */
    @Override
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        String finalWhere;
        
    	int id = mUriMatcher.match(uri);
    	String tableName = hash_id_tableName.get(id);
    	if (tableName != null){
    		if (isMain(id)){
    			// If URI is main table, update uses incoming where clause and args.
    			count = db.update(tableName, values, where, whereArgs);
    		}
    		else{
                // If URI is for a particular row ID, update is based on incoming
                // data but modified to restrict to the given ID.
                finalWhere = DatabaseUtilsCompat.concatenateWhere(
                		getIdName(tableName) + " = " + ContentUris.parseId(uri), where);
                count = db.update(tableName, values, finalWhere, whereArgs);    			
    		}
    	}
    	else{
    		throw new IllegalArgumentException("Unknown URI " + uri);
    	}

        getContext().getContentResolver().notifyChange(uri, null);

        return count;
    }
	
}

 

你可能感兴趣的:(android,ContentProvider,example)