Android之ContentProvider共享数据

作者: 哇楼主 | 来源:发表于2016-09-12 21:06 被阅读289次
    • 什么是ContentProvider
      是所有应用程序之间数据存储和检索的桥梁
      作用:将应用程序的私有数据向外提供一个访问的接口, 是基于URI的格式 ,向外提供数据访问的接口
      ContentProvider 内容提供者 负责暴露数据 相当于服务器
      ContentResolver 内容解析者 负责解析ContentProvider暴露的数据 相当于客户端

    • 自定义ContentProvider
      1.定义一个类继承ContentProvider,重写父类的六个方法
      boolean onCreate() //初始化Provider
      Uri insert(Uri uri,ContentValues values)//插入新数据
      int delete(Uri uri, String selection, String[] selectionArgs)//删除数据
      int update(Uri uri,ContentValues values, String selection, String[] selectionArgs)//更新已存在数据
      Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs,String sortOrder) //返回数据给调用者
      String getType(Uri uri) //返回ContentProvider的mime数据
      2.声明ContentProvider的唯一标识(小写字母,建议:包名+数据库名)
      3.声明访问数据库的Code码(是在CotentProvider暴露数据时使用)
      4.定义Uri的匹配器UriMatcher,并且实例化(其他应用程序在通过ContentResolver执行CURD操作时,都需要一个重要的参数Uri,为了顺利提供这个Uri参数,Android系统提供了一个UriMatcher工具类)
      private static UriMatcher uriMatcher ;
      static
      {
      uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
      uriMatcher.add("唯一标识","路径(建议: 表名)",当前Uri对应的数据库的code码);
      }
      5.定义一个数据库的帮助类(SQLiteOpenHelper),并在onCreate() 方法中完成数据表的初始
      6.在相应的增 删 改 查 方法中, 通过Uri匹配器, 判断当前用户传入的Uri到底是操作那张表的code
      7.在清单文件中注册ContentProvider
      <provider
      android:name="" 说明注册的是哪个CotentProvider (全类名)
      android:authorities="" 与CotentProvider中的 唯一标识完全一致
      android:exported="" 声明当前应用程序 可以被外部的应用程序访问
      />

    • 注意:
      ContentProvider是单例模式的,当多个应用程序通过使用ContentResolver来操作使用ContentProvider提供的数据时,ContentResolver调用的数据操作会委托给同一个ContentProvider来处理,这样就能保证数据的一致性。

    • 实例:
      public class UserContentProvider extends ContentProvider {
      private DbOpenHelper dbOpenHelper;
      //2, 声明ContentProvider组件的唯一表示, 必须是小写的字母
      //建议: 应用程序的包名+标识资源的名称 (数据库的名称)
      private static final String AUTHORITY = "com.qf.day16_contentprovider_04.qf";
      //3, 声明访问数据库中的那些表的code
      private static final int CODE_USER = 0;
      private static final int CODE_ORDER = 5;
      //4, 声明Uri的匹配器, 实例化
      private static UriMatcher uriMatcher;
      static{
      //匹配码 UriMatcher.NO_MATCH : 不匹配任何的Uri
      uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

        //注册的Uri
        /**
         * authority    CotentProvider 的唯一表示
         * path         路径(建议为表名,但是不一定)
         * code         当前url的匹配码
         */
        //content://com.qf.day16_contentprovider_04.qf/t_user
        uriMatcher.addURI(AUTHORITY, "t_user", CODE_USER);//URI
        
        //content://com.qf.day16_contentprovider_04.qf/t_order
        uriMatcher.addURI(AUTHORITY, "t_order", CODE_ORDER);    
      }
      @Override
      public boolean onCreate() {
        // 初始化的工作
        //getContext() 得到上下文对象
        dbOpenHelper = new DbOpenHelper(getContext());
        return false;
      }
      
      @Override
      public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        // 查询数据
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
        
        Cursor curson = null;
        //通过Uri的匹配器, 判断当前的Uri访问的是那张表
        switch (uriMatcher.match(uri)) {
        case CODE_USER:
            
            curson = db.query("t_user", projection, selection, selectionArgs, null, null, sortOrder);
            
            break;
      
        case CODE_ORDER:
            
            curson = db.query("t_order", projection, selection, selectionArgs, null, null, sortOrder);
            
            break;
        }
        
        return curson;
      }
      @Override
      public Uri insert(Uri uri, ContentValues values) {
        // 插入数据
        
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
        
        long id = 0 ;
        if(uriMatcher.match(uri)==CODE_USER)
        {
            //向数据库中插入数据后, 返回当前插入数据的id
            id = db.insert("t_user", null, values);
            
            //生成最新的URI  并返回(旧的Uri + id)
            //content://com.qf.day16_contentprovider_04.qf/t_user/7
            return ContentUris.withAppendedId(uri, id);
            
        }
        if(uriMatcher.match(uri) == CODE_ORDER)
        {
            id = db.insert("t_order", null, values);
            
            return ContentUris.withAppendedId(uri, id);
        }
        
        return null;
      }
      
      @Override
      public int delete(Uri uri, String selection, String[] selectionArgs) {
        // 删除数据
        
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
        
        int count = 0;
        
        if(uriMatcher.match(uri) == CODE_USER)
        {
            count = db.delete("t_user", selection, selectionArgs);
        }
        
        return count;
      }
      
      @Override
      public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // 修改数据
        
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
        
        int count = 0;
        if(uriMatcher.match(uri) == CODE_USER)
        {
            count = db.update("t_user", values, selection, selectionArgs);
        }
        
        return count;
      }
      
      @Override
      public String getType(Uri uri) {
        // TODO 只实现, 不处理
        return null;
      }
      }

    相关文章

      网友评论

        本文标题:Android之ContentProvider共享数据

        本文链接:https://www.haomeiwen.com/subject/cdopettx.html