Android学习笔记----自定义ContentProvider

/*************************************************************************************/

创建自己的内容提供者

步骤:
1  创建一个类继承自ContentProvider,重写OnCreate(),query(),insert(),update(),delete(),getType()方法;
2  在AndroidManifest.xml文件中注册自定义的内容提供者。

创建 一个工具类,这个工具类里面,只是定义了一些简单的常量,这个工具类的作用是告诉其他应用程序,访问该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的数据
                .........................
            }

            .................................................
            
}


实际上,完全可以不提供上面的工具类,而是在ContentProvider中,直接使用字符串来定义服务的uri。接下来再采用文档去告诉其他应用程序访问该ContentProvider的入口。但是这种方式的可维护性并不好,因此在实际的项目中(包括安卓系统的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);










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值