Android四大组件之contentProvider

时间:2023-03-09 10:03:54
Android四大组件之contentProvider

Activity,Service,broadcast and Contentprovider

android 4 大组件。

ContentProvider:使用

public class ImageSearchProvider extends ContentProvider {

    public final static String TAG = "ImageSearch.Provider";
public final static String DBASE_NAME = "imagesearch.db";
public final static int DBASE_VERSION = 1;
public final static String AUTHORITY = "com.globalsearch.imagesearch";
public final static UriMatcher URI_MATCHER;
public static ImageSearchDatabaseHelper mHelper =null;
private static final int SEARCH_COLLECTION_URI_INDICATER = 1;
private static final int SEARCH_SINGAL_URI_INDICATER = 2;
static{
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
URI_MATCHER.addURI(AUTHORITY, SearchMetaData.TABLE_NAME, SEARCH_COLLECTION_URI_INDICATER);
URI_MATCHER.addURI(AUTHORITY, SearchMetaData.TABLE_NAME+"/#", SEARCH_SINGAL_URI_INDICATER);
}
public static class SearchMetaData implements BaseColumns
{
private SearchMetaData(){}; public final static String TABLE_NAME = "search";
public static final Uri CONTENT_URI = Uri.parse("content://"
+ ImageSearchProvider.AUTHORITY + "/search");
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.imagesearch.search";
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.imagesearch.search";
public static final String DEFAULT_SORT_ORDER = "modified DESC"; public static final int IMAGE_TYPE_PATH = 1;
public static final int IMAGE_TYPE_CONTACT = 2; public static final String PERSIOD_ID = "persion_id";
public static final String BITMAP_PATH = "path";
public static final String TYPE = "type";
public static final String CONTACT_ID = "contact_id";
public static final String BITMAP_SIZE = "bitmap_size";
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count =0;
SQLiteDatabase db = mHelper.getWritableDatabase();
switch(URI_MATCHER.match(uri))
{
case SEARCH_COLLECTION_URI_INDICATER:
count = db.delete(SearchMetaData.TABLE_NAME, selection, selectionArgs);
break;
case SEARCH_SINGAL_URI_INDICATER:
String id = uri.getPathSegments().get(1);
count = db.delete(SearchMetaData.TABLE_NAME,
SearchMetaData._ID+"="+id+(!TextUtils.isEmpty(selection)?"AND("+selection+')':""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown Uri "+uri);
} getContext().getContentResolver().notifyChange(uri, null);
return count;
} @Override
public String getType(Uri uri) {
switch(URI_MATCHER.match(uri))
{
case SEARCH_COLLECTION_URI_INDICATER:
return SearchMetaData.CONTENT_TYPE;
case SEARCH_SINGAL_URI_INDICATER:
return SearchMetaData.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("Unknown Uri "+uri);
}
} @Override
public Uri insert(Uri uri, ContentValues values) {
if (URI_MATCHER.match(uri) != SEARCH_COLLECTION_URI_INDICATER) {
throw new IllegalArgumentException("Unknown Uri " + uri);
} ContentValues inValue; if (values != null) {
inValue = new ContentValues(values);
} else {
inValue = new ContentValues();
} if (inValue.containsKey(SearchMetaData.PERSIOD_ID) == false) { throw new IllegalArgumentException(
"fail to insert row because persion_id is need " + uri);
} boolean containsBitmapPath =inValue.containsKey(SearchMetaData.BITMAP_PATH) ;
boolean containsContactId = inValue.containsKey(SearchMetaData.CONTACT_ID) ;
if((containsBitmapPath == false) && (containsContactId == false))
{
throw new IllegalArgumentException(
"fail to insert row because Path or ContactId must need one " + uri);
}
else if(containsBitmapPath && containsContactId)
{
throw new IllegalArgumentException(
"fail to insert row because Path and ContactId need only one " + uri);
}
else if(containsBitmapPath)
{
if(inValue.containsKey(SearchMetaData.TYPE) == false)
{
inValue.put(SearchMetaData.TYPE, SearchMetaData.IMAGE_TYPE_PATH);
}
}
else if(containsContactId)
{
if(inValue.containsKey(SearchMetaData.TYPE) == false)
{
inValue.put(SearchMetaData.TYPE, SearchMetaData.IMAGE_TYPE_CONTACT);
}
} SQLiteDatabase db = mHelper.getWritableDatabase(); long rowId = db.insert(SearchMetaData.TABLE_NAME, SearchMetaData.PERSIOD_ID, inValue); if(rowId>0)
{
Uri inSertAppUri = ContentUris.withAppendedId(SearchMetaData.CONTENT_URI, rowId);
getContext().getContentResolver().notifyChange(uri, null);
return inSertAppUri;
} throw new IllegalArgumentException(
"insert row failed " + uri);
} @Override
public boolean onCreate() {
Log.i(TAG, "[onCreate]");
mHelper = new ImageSearchDatabaseHelper(getContext(), DBASE_NAME, null, DBASE_VERSION);
Intent intent = new Intent(ImageSearchReceiver.BUILD_SEARCH_IMAGE_ACTION);
this.getContext().sendBroadcast(intent);
return false;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = mHelper.getReadableDatabase();
Cursor dbInnerCursor =null;
switch(URI_MATCHER.match(uri))
{
case SEARCH_COLLECTION_URI_INDICATER:
dbInnerCursor = db.query(SearchMetaData.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
break;
case SEARCH_SINGAL_URI_INDICATER:
// String id = String.valueOf(ContentUris.parseId(uri));
String id = uri.getPathSegments().get(1);
dbInnerCursor = db.query(SearchMetaData.TABLE_NAME, projection,
SearchMetaData._ID+"="+id+(!TextUtils.isEmpty(selection)?"AND("+selection+')':""),
selectionArgs, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("Unknown Uri " + uri);
} return dbInnerCursor;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int count =0;
SQLiteDatabase db = mHelper.getWritableDatabase();
int match = URI_MATCHER.match(uri);
Log.i(TAG, "match "+match);
switch(match)
{
case SEARCH_COLLECTION_URI_INDICATER:
count = db.update(SearchMetaData.TABLE_NAME,values, selection, selectionArgs);
break;
case SEARCH_SINGAL_URI_INDICATER:
String id = uri.getPathSegments().get(1);
count = db.update(SearchMetaData.TABLE_NAME,values,
SearchMetaData._ID+"="+id+(!TextUtils.isEmpty(selection)?"AND("+selection+')':""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown Uri "+uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
} }
import com.globalsearch.imagesearch.provider.ImageSearchProvider.SearchMetaData;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class ImageSearchDatabaseHelper extends SQLiteOpenHelper { public ImageSearchDatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
//create table search
db.execSQL("CREATE TABLE "+SearchMetaData.TABLE_NAME+"("+
SearchMetaData._ID+" INTEGER PRIMARY KEY,"+
SearchMetaData.PERSIOD_ID+" INTEGER,"+
SearchMetaData.BITMAP_PATH+" TEXT,"+
SearchMetaData.TYPE+" INTEGER,"+
SearchMetaData.CONTACT_ID+" INTEGER,"+
SearchMetaData.BITMAP_SIZE+" INTEGER"+
")"
);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub } }

1.定义provider extends ContentProvider

2.定义ImageSearchDatabaseHelper extends SQLiteOpenHelper

在onCreate的时候,创建数据库的表

然后在provider的onCreate中new helper。这样就能实现provider中的insert,query,update,delete方法。

上层通过mContentResolver 异步的方式调用,最终会调用到contentprovier。

contentprovier是一种数据库调用的框架,user只需要实现具体的contentprovider,而无需关心contentprovier的具体调用流程。

aaarticlea/png;base64,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*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" alt="" />

调用流程如上。

ContentProvider:监听。

数据库的监听使用的都是观察者模式,通过

mContentResolver.registerContentObserver(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, mImageStoreObserver);

来设定监听对象,判断数据库有变化。

自己定义ContentProvider的时候,如果变化,就需要通知getContext().getContentResolver().notifyChange(uri, null);

ContentProvider版本更新

在SQLiteOpenHelper 里面有

      @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db); }

在这里可以通过SQL语句更新数据库内容。

ContentProvider的权限和Uri

Uri:"content://"+ AUTHORITY + "/image_search"

AUTHORITY定义在Androidmanifest.xml,通常通过AUTHORITY可以获取该contentprovider。

<provider
            android:name="com.globalsearch.imagesearch.service.provider.ImageSearchProvider"
            android:authorities="com.globalsearch.imagesearch"
            android:exported="false" >
        </provider>

android:exported="false"表面外部程序不能访问该数据库。