/*************************************************************************************/
创建自己的内容提供者
步骤:
1 创建一个类继承自ContentProvider,重写OnCreate(),query(),insert(),update(),delete(),getType()方法;
2 在AndroidManifest.xml文件中注册自定义的内容提供者。
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;
}
}
注册创建的内容提供者
使用自定义的内容提供者
查询Book表
Cursor cursor = getContentResolver.query(MyContentProviderUtil.Books.BOOK_DIR,"select name","where price=?",new String[]{"10"},null);
Cursor cursor = getContentResolver.query(MyContentProviderUtil.Books.BOOK_ITEM_ONE,"select name",null,null,null);
查询AuthorDetail表
Cursor cursor = getContentResolver.query(MyContentProviderUtil.AuthorDetails.AuthorDetail_DIR,"select wokrs","where bir=?",new String[]{"10"},null);
Cursor cursor = getContentResolver.query(MyContentProviderUtil.AuthorDetails.AuthorDetail_ITEM,"select works",null,null,null);