ContentProvider-UriMatch匹配实现CURD(4)

来源:互联网 发布:网络与新媒体工资待遇 编辑:程序博客网 时间:2024/05/17 23:46

1.为CP以及底层数据库提供元数据:

/** * @author Lean */public class BookProviderMetaData {public static final String AUTHORITY="com.androidbook.provider.BookProvider";public static final String DATABASE_NAME="book.db";public static final int DATABASE_VERSION=1;public static final String BOOKS_TABLE_NAME="books";private BookProviderMetaData(){};/** * BaseColumns improve a column named "_id" */public static final class BookTableMetaData implements BaseColumns{private BookTableMetaData(){};//define Table and column namepublic static final String TABLE_NAME="books";public static final String COLUMN_BOOK_NAME="name";public static final String COLUMN_BOOK_ISBN="sibn";public static final String COLUMN_BOOK_AUTHOR="author";public static final String COLUMN_CREATED_TIME="created";public static final String COLUMN_MODEFIED_TIME="modified";public static final String DEFAULT_SORT_ORDER="modified DESC";//define Uri and mime typepublic static final Uri CONTENT_URI=Uri.parse("content://"+AUTHORITY+"/books");public static final String CONTENT_TYPE="vnd.android.cursor.dir/vnd.androidbook.book";public static final String CONTENT_ITEM_TYPE="vnd.android.cursor.item/vnd.androidbook.book";}}

2.将数据库的创建更新封装成一个对象SQLiteOpenHelper:

/** * @author Lean */public class DatabaseHelper extends SQLiteOpenHelper{public DatabaseHelper(Context context) {super(context, BookProviderMetaData.DATABASE_NAME, null, BookProviderMetaData.DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE "+BookTableMetaData.TABLE_NAME+" ("+BookTableMetaData._ID +" INTEGER PRIMARY KEY AUTOINCREMENT ,"+BookTableMetaData.COLUMN_BOOK_NAME+" TEXT,"+BookTableMetaData.COLUMN_BOOK_ISBN+" TEXT,"+BookTableMetaData.COLUMN_BOOK_AUTHOR+" TEXT,"+BookTableMetaData.COLUMN_CREATED_TIME+" INTEGER,"+BookTableMetaData.COLUMN_MODEFIED_TIME+" INTEGER"+" );");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS "+BookTableMetaData.TABLE_NAME +" ;");onCreate(db);}} 

3.通过继承ContentProvider并实现onCreate(),getType(),query(),insert(),delete(),update();

/** * @author Lean */public class BookProvider extends ContentProvider {//为Cursor创建数据字段影射private static HashMap<String,String> sBookProjectionMap;static {sBookProjectionMap=new HashMap<String, String>();sBookProjectionMap.put(BookTableMetaData._ID, BookTableMetaData._ID);sBookProjectionMap.put(BookTableMetaData.COLUMN_BOOK_NAME, BookTableMetaData.COLUMN_BOOK_NAME);sBookProjectionMap.put(BookTableMetaData.COLUMN_BOOK_ISBN, BookTableMetaData.COLUMN_BOOK_ISBN);sBookProjectionMap.put(BookTableMetaData.COLUMN_BOOK_AUTHOR, BookTableMetaData.COLUMN_BOOK_AUTHOR);sBookProjectionMap.put(BookTableMetaData.COLUMN_CREATED_TIME, BookTableMetaData.COLUMN_CREATED_TIME);sBookProjectionMap.put(BookTableMetaData.COLUMN_MODEFIED_TIME, BookTableMetaData.COLUMN_MODEFIED_TIME);}//创建UriMatcher以区别数据集或单个数据private static final UriMatcher sUriMatcher;private static final int INCOMING_BOOK_COLLECTION_URI_INDICATOR = 1;private static final int INCOMING_SINGLE_BOOK_URI_INDICATOR=2;static {sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH);sUriMatcher.addURI(BookProviderMetaData.AUTHORITY, "books", INCOMING_BOOK_COLLECTION_URI_INDICATOR);sUriMatcher.addURI(BookProviderMetaData.AUTHORITY, "books/#", INCOMING_SINGLE_BOOK_URI_INDICATOR);}//创建SQLiteOpenHelper以创建SQLiteDataBase执行CURDprivate DatabaseHelper mDbHelper;@Overridepublic boolean onCreate() {Log.v("LeanLog","BookProvider created------>Process Build");mDbHelper=new DatabaseHelper(getContext());return true;}/*   * @return 返回MIME类型“类型/子类型” */@Overridepublic String getType(Uri uri) {switch (sUriMatcher.match(uri)) {case INCOMING_BOOK_COLLECTION_URI_INDICATOR:return BookTableMetaData.CONTENT_TYPE;case INCOMING_SINGLE_BOOK_URI_INDICATOR:return BookTableMetaData.CONTENT_ITEM_TYPE;default:Log.v("LeanLog","Unknow URI :"+uri);break;}return null;}/*   * 通过SQLiteQueryBuilder附加各种sql条件,并执行Query语句 */@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)  {SQLiteQueryBuilder qb=new SQLiteQueryBuilder();switch (sUriMatcher.match(uri)) {case INCOMING_BOOK_COLLECTION_URI_INDICATOR:qb.setTables(BookTableMetaData.TABLE_NAME);qb.setProjectionMap(sBookProjectionMap);break;case INCOMING_SINGLE_BOOK_URI_INDICATOR:qb.setTables(BookTableMetaData.TABLE_NAME);qb.setProjectionMap(sBookProjectionMap);qb.appendWhere(BookTableMetaData._ID+"="+uri.getPathSegments().get(1));break;default:Log.v("LeanLog","Unknow URI :"+uri);return null;}String orderBy;if (TextUtils.isEmpty(sortOrder)) {orderBy=BookTableMetaData.DEFAULT_SORT_ORDER;}else {orderBy=sortOrder;}SQLiteDatabase db=mDbHelper.getReadableDatabase();Cursor cursor=qb.query(db, projection, selection, selectionArgs, null, null, orderBy);cursor.setNotificationUri(getContext().getContentResolver(),uri);return cursor;}/*   * sqlitedatabase执行insert语句,并将得到的id通过ContentUris添加为新的URI */@Overridepublic Uri insert(Uri uri, ContentValues initalValues) {if (sUriMatcher.match(uri)!=INCOMING_BOOK_COLLECTION_URI_INDICATOR) {Log.v("LeanLog","Unknow URI :"+uri);}ContentValues values;if (initalValues!=null) {values=new ContentValues(initalValues);}else {values=new ContentValues();}Long now =Long.valueOf(System.currentTimeMillis());if (!values.containsKey(BookTableMetaData.COLUMN_CREATED_TIME)) {values.put(BookTableMetaData.COLUMN_CREATED_TIME, now);}if (!values.containsKey(BookTableMetaData.COLUMN_MODEFIED_TIME)) {values.put(BookTableMetaData.COLUMN_MODEFIED_TIME, now);}if (!values.containsKey(BookTableMetaData.COLUMN_BOOK_NAME)) {Log.v("LeanLog","BOOK_NAME is needed!");return null;}if (!values.containsKey(BookTableMetaData.COLUMN_BOOK_ISBN)) {values.put(BookTableMetaData.COLUMN_BOOK_ISBN, "Unknown isbn");}if (!values.containsKey(BookTableMetaData.COLUMN_BOOK_AUTHOR)) {values.put(BookTableMetaData.COLUMN_BOOK_AUTHOR, "Unknown author");}SQLiteDatabase db=mDbHelper.getWritableDatabase();long rowId=db.insert(BookTableMetaData.TABLE_NAME, BookTableMetaData.COLUMN_BOOK_NAME, values);if (rowId>0) {Uri newInsertUri=ContentUris.withAppendedId(uri, rowId);getContext().getContentResolver().notifyChange(newInsertUri,null);return newInsertUri ; }getContext().getContentResolver().notifyChange(uri,null);return null;}/*   * TIP:ContentResolver.notifyChange()唤醒监听器刷新数据 */@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db=mDbHelper.getWritableDatabase();int count = 0 ;switch (sUriMatcher.match(uri)) {case INCOMING_BOOK_COLLECTION_URI_INDICATOR:count=db.delete(BookTableMetaData.TABLE_NAME, selection, selectionArgs);break;case INCOMING_SINGLE_BOOK_URI_INDICATOR:String deleteRowId=uri.getPathSegments().get(1);String selectArgs=!TextUtils.isEmpty(selection)?" and "+selection:"";count=db.delete(BookTableMetaData.TABLE_NAME,BookTableMetaData._ID+"="+deleteRowId+selectArgs+";" , selectionArgs);break;default:return -1;}getContext().getContentResolver().notifyChange(uri,null);return count;}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)  {SQLiteDatabase db=mDbHelper.getWritableDatabase();int count = 0 ;switch (sUriMatcher.match(uri)) {case INCOMING_BOOK_COLLECTION_URI_INDICATOR:count=db.update(BookTableMetaData.TABLE_NAME, values,selection, selectionArgs);break;case INCOMING_SINGLE_BOOK_URI_INDICATOR:String deleteRowId=uri.getPathSegments().get(1);String selectArgs=!TextUtils.isEmpty(selection)?" and "+selection:"";count=db.update(BookTableMetaData.TABLE_NAME,values,BookTableMetaData._ID+"="+deleteRowId+selectArgs+";" , selectionArgs);break;default:return -1;}getContext().getContentResolver().notifyChange(uri,null);return count;}}

4.注册AndroidManifest.xml

<provider             android:name=".BookProvider"             android:authorities="com.androidbook.provider.BookProvider"             android:multiprocess="true"  />

调用:

@Overridepublic void onClick(View v) {ContentResolver resolver=getContentResolver();switch (v.getId()) {case R.id.insert:ContentValues values=new ContentValues();values.put(ResolveMetaData.COLUMN_BOOK_NAME, "a book named A");values.put(ResolveMetaData.COLUMN_BOOK_ISBN, "2051-245-1153B");values.put(ResolveMetaData.COLUMN_BOOK_AUTHOR, "Lean writed");resolver.insert(Uri.parse("content://"+ResolveMetaData.AUTHORITY+"/books"), values);break;case R.id.query:Cursor cursor=resolver.query(Uri.parse("content://"+ResolveMetaData.AUTHORITY+"/books"), null, null, null, null);if (!cursor.moveToFirst()) {return ;}Log.v("LeanLog",cursor.getString(cursor.getColumnIndex(ResolveMetaData.COLUMN_BOOK_NAME)));while (cursor.moveToNext()) {Log.v("LeanLog",cursor.getString(cursor.getColumnIndex(ResolveMetaData.COLUMN_BOOK_NAME)));}break;case R.id.update:ContentValues values2=new ContentValues();values2.put(ResolveMetaData.COLUMN_BOOK_NAME, "a book named A");values2.put(ResolveMetaData.COLUMN_BOOK_ISBN, "2051-245-1153B");values2.put(ResolveMetaData.COLUMN_BOOK_AUTHOR, "Lean writed");int count=resolver.update(Uri.parse("content://"+ResolveMetaData.AUTHORITY+"/books/5"), values2, null, null);Log.v("LeanLog",count+"");break;case R.id.delete:int deleteCount=resolver.delete(Uri.parse("content://"+ResolveMetaData.AUTHORITY+"/books/2"), null, null);Log.v("LeanLog",deleteCount+"");break;default:break;}}


0 0