/*************************************************************************************/
public final class MyContentProviderUtil{
//定義該ContentProvider的Authority
public static final String AUTHORITY = "com.example.youxi.provider";
public static final class Books implements BaseColumns{
//定義該content所允許操作的Book表的三個數據列
public static final String _ID = "_id";
public static final String NAME = "name";
public static final String PRICE = "price";
public static final String AUTHOR = "author";
public static final Uri BOOK_DIR = Uri.parse("content://"+AUTHORITY+"/book");//允許操作整個book表的數據
public static final Uri BOOK_ITEM_ONE = Uri.parse("content://"+AUTHORITY+"/book/1");//允許操作book表中id爲1的數據
.........................
}
public static final class AuthorDetails implements BaseColumns{
//定義該content所允許操作的AuthorDetail表的三個數據列
public static final String _ID = "_id";
public static final String WORKS = "works";
public static final String BIRTHDAY = "bir";
public static final Uri AUTHORDETAIL_DIR = Uri.parse("content://"+AUTHORITY+"/authordetail");//允許操作整個AuthorDetail表的數據
public static final Uri AUTHORDETAIL_ITEM_ONE = Uri.parse("content://"+AUTHORITY+"/authordetail/1");//允許操作AuthorDetail表中id爲1的數據
.........................
}
.................................................
}
實際上,完全可以不提供上面的工具類,而是在ContentProvider中,直接使用字符串來定義服務的uri。接下來再採用文檔去告訴其他應用程序訪問該ContentProvider的入口。但是這種方式的可維護性並不好,因此在實際的項目中(包括安卓系統的ContentProvider)都會採用工具類,來定義各種常量的方式,進行處理。
public final class MyContentProviderUtil{
//定義該ContentProvider的Authority
public static final String AUTHORITY = "com.example.youxi.provider";
public static final class Books implements BaseColumns{
//定義該content所允許操作的Book表的三個數據列
public static final String _ID = "_id";
public static final String NAME = "name";
public static final String PRICE = "price";
public static final String AUTHOR = "author";
public static final Uri BOOK_DIR = Uri.parse("content://"+AUTHORITY+"/book");//允許操作整個book表的數據
public static final Uri BOOK_ITEM_ONE = Uri.parse("content://"+AUTHORITY+"/book/1");//允許操作book表中id爲1的數據
.........................
}
public static final class AuthorDetails implements BaseColumns{
//定義該content所允許操作的AuthorDetail表的三個數據列
public static final String _ID = "_id";
public static final String WORKS = "works";
public static final String BIRTHDAY = "bir";
public static final Uri AUTHORDETAIL_DIR = Uri.parse("content://"+AUTHORITY+"/authordetail");//允許操作整個AuthorDetail表的數據
public static final Uri AUTHORDETAIL_ITEM_ONE = Uri.parse("content://"+AUTHORITY+"/authordetail/1");//允許操作AuthorDetail表中id爲1的數據
.........................
}
.................................................
}
public class MyContentProvider extends ContentProvider{
public static final int BOOK_DIR = 0;
public static final int BOOK_ITEM = 1;
public static final int AUTHORDETAIL_DIR = 2;
public static final int AUTHORDETAIL_ITEM = 3;
// private static final String AUTHORITY = "com.example.youxi.provider";
private static UriMatCher uriMarcher;
private MyDbHelper myDbHelper;
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(MyContentProviderUtil.AUTHORITY ,"book",BOOK_DIR );
uriMatcher.addURI(MyContentProviderUtil.AUTHORITY ,"book/#",BOOK_ITEM);
uriMatcher.addURI(MyContentProviderUtil.AUTHORITY ","authordetail", AUTHORDETAIL_DIR);
uriMatcher.addURI(MyContentProviderUtil.AUTHORITY ,"authordetail/#",AUTHORDETAIL_ITEM);
}
@Override
public boolean OnCreate(){
myDbHelper = new MyDbHelper(getContext(),"BookStore.db",null,2);
return true;
}
@Override
public Cursor query(Uri uri,String projection,String selection,String[] selectionArgs,String sortOrder){
SQLiteDatabase db = myDbHelper.getReadableDatabase();
Cursor cursor;
switch(uriMarcher.match(uri)){
case BOOK_DIR:
cursor = db.query("Book",projection,selection,selectionArgs,null,null,sortOrder);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegMents().get(1);
cursor = db.query("Book",projection,"_id = ?",new String[]{bookId},null,null,sortOrder);
break;
case AUTHORDETAIL_DIR :
cursor = db.query(" AuthorDetail",projection,selection,selectionArgs,null,null,sortOrder);
break;
case AUTHORDETAIL_ITEM:
String cateGoryId = uri.getPathSegMents.get(1);
cursor = db.query(" AuthorDetail",projection,"_id=?",new String[cateGoryId],null,null,sortOrder);
break;
default
break;
}
return cursor;
}
@Override
public Uri insert(Uri uri,ContentValues values){
Uri uriReturn = null;
SQLiteDatabase db = myDbHelper.getWritableDatabase();
switch(uriMarcher.match(uri)){
case BOOK_DIR:
break;
case BOOK_ITEM:
long newId = db.insert("Book",null,values);
uriReturn = Uri.parse("content://"+AUTHORITY +"/book/"+newId);
break;
case AUTHORDETAIL_DIR :
break;
case AUTHORDETAIL_ITEM:
long newCateGoryId = db.insert("AuthorDetail",null,values);
uriReturn = Uri.parse("content://"+AUTHORITY+"/category/"+newCateGoryId);
break;
default
break;
}
return uriReturn ;
}
@Override
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs){
int updateRows = 0;
SQLiteDatabase db = myDbHelper.getWritableDatabase();
switch(uriMarcher.match(uri)){
case BOOK_DIR:
updateRows = db.update("Book",values,selection,selectionArgs);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegMents().get(1);
updateRows = db.update("Book",values,"_id = ?",new String[]{bookId});
break;
case AUTHORDETAIL_DIR :
updateRows = db.update(" AuthorDetail",values,selection,selectionArgs);
break;
case AUTHORDETAIL_ITEM:
String categoryId = db.getPathSegments.get(1);
updateRows = db.update(" AuthorDetail",values,"_id=?",new String[]{categoryId});
break;
default
break;
}
return updateRows;
}
@Override
public int delete(Uri uri,String selection,String[] selectionArgs){
int deleteRows = 0;
SQLiteDatabase db = myDbHelper.getWritableDatabase();
switch(uriMarcher.match(uri)){
case BOOK_DIR:
deleteRows = db.delete("Book",selection,selectionArgs);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegMents.get(1);
deleteRows = db.delete("Book","_id = ?",new String[]{bookId});
break;
case AUTHORDETAIL_DIR :
deleteRows = db.delete(" AuthorDetail",selection,selectionArgs);
break;
case AUTHORDETAIL_ITEM:
Sting cateGoryId= uri.getPathSegMents.get(1);
deleteRows = db.delete(" AuthorDetail","_id = ?",new String[]{cateGoryId});
break;
default
break;
}
return deleteRows;
}
@Override
public String getType(Uri uri ){
switch(uriMarcher.match(uri)){
case BOOK_DIR:
return "vnd.android.cursor.dir/vnd.android.example.youxi.provider.book";
break;
case BOOK_ITEM:
return "vnd.android.cursor.item/vnd.com.example.youxi.provider.book";
break;
case AUTHORDETAIL_DIR :
return "vnd.android.cursor.dir/vnd.android.example.youxi.provider.authordetail";
break;
case AUTHORDETAIL_ITEM:
return "vnd.android.cursor.item/vnd.android.example.youxi.provider.authordetail";
break;
default
break;
}
return null;
}
}
註冊創建的內容提供者