Android基础——四大组件之ContentProvider

终于到最后一个了。

ContentProvider

  1. Xmind
    ContentProvider


  2. 简单介绍一下ContentProvider

    • 作为四大组件之一的内容提供者,作用与好处也十分明显,他同一了对外共享数据的访问方式。
    • 在另一个应用能够通过ContentProvider对共享出数据的内容提供应用里的数据进行增删改查。

  3. 内容提供方

    • 创建类继承ContentProvider并覆写其方法:

      public class TestContentProvider extends ContentProvider {
          @Override
          public boolean onCreate() {
              return false;
          }
          @Override
          public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
              return null;
          }
          @Override
          public String getType(Uri uri) {
              return null;
          }
      
          @Override
          public Uri insert(Uri uri, ContentValues values) {
              return null;
          }
      
          @Override
          public int delete(Uri uri, String selection, String[] selectionArgs) {
              return 0;
          }
      
          @Override
          public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
              return 0;
          }
      }
      
    • 然后在AndroidManif.xml中添加配置TestContentProvider:

      <provider android:name=".TestContentProvider" 
                 android:authorities="com.xblydxj.provider.testprovider"/>
  4. Uri

    Uri代表了要操作的数据

    1. 主要包含两部分信息:
      • 需要操作的ContentProvider。
      • 对ContentProvider中的什么数据进行操作。
    2. 组成:
      Uri
      具体的介绍在Xmind里已经描述了。
    3. UriMatcher类
      为了解析Uri,从Uri中获取数据,android提供了两个用于操作Uri的工具类

      • UriMatcher类用于匹配Uri:

        String uri = "content://com.xblydxj.provider.testprovider/data/5";
        UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
        matcher.addURI(AUTHORITY, "data/insert", 1);
        matcher.addURI(AUTHORITY, "data/delete", 2);
        switch(matcher.match(Uri.parse(uri))){
            case 1:
                break;
            case 2:
                break;
            default:
                break;
        }

        UriMatcher.No_MATCH表示不匹配任何路径的返回码,default设置为不匹配的选择。

      • ContentUris类用于操作Uri路径后面的Id部分:

        • withAppendedId(uri,id)方法,为path添加id

          Uri uri = Uri.parse("content://com.xblydxj.provider.testprovider/data/5");
              Uri resultUri = ContentUris.withAppendedId(uri,5);
          
        • parseId(uri)用于从path中获取id:

          Uri uri = Uri.parse("content://com.xblydxj.provider.testprovider/data/5")
              long personid = ContentUris.parseId(uri);
  5. ContentResolver
    当内容提供者应用为外部应用提供了数据之后,外部应用可以使用Activity的getContentResolver方法获取ContentResolver用于对内容提供者应用进行增删改查操作。

    • 创建ContentResolver对象

      ContentResolver resolver = getContentResolver();
    • 添加,先获取其参数

      Uri uri = Uri.parse("content://com.xblydxj.provider.testprovider/data/5");
      ContentValues values = new ContentValues();
      values.put("_id", 1);
      values.put("name", "xblydxj");
      values.put("age", 24);
      resolver.insert(uri, values);
    • 查询data表记录

      Cursor cursor = resolver.query(uri, null, null, null, "data _id desc");
      while(cursor.moveToNext()){
          Lot.d("tag", "data:[id="+cursor.getInt(0)+",name="+cursor.getString(1)+",age="+cursor.getInt(2)+"]");
      }
    • 修改表

      ContentValues updateValues = new ContentValues();
      updateValues.put("name", "xzy");
      Uri updateUri = ContentUris.withAppendedId(uri, 3);
      resolver.update(updateIdUri, updateValues, null, null);
    • 删除表

      Uri deleteIdUri = ContentUri.withAppendedId(uri, 2);
      resolver.delete(deleteUri,null,null);
    • 在ContentProvider的访问者需要知道ContentProvider中的数据发生变化,可以使用以下方法:
      public class PersonContentProvider extends ContentProvider {
      public Uri insert(Uri uri, ContentValues values) {
            db.insert("data", "_id", values);
            getContext().getContentResolver().notifyChange(uri, null);
         }
      }
  6. ContentObserver
    上述方法是提供者应用提供给访问者得到数据变化的通知,而本方法用于访问者得到数据变化的通知:

        getContentResolver().registerContentObserver(Uri.parse("content://com.xblydxj.provider.testprovider/data"), true, new Observer(new Handler()));
    
    public class Observer extends ContentObserver{
       public Observer(Handler handler) {
          super(handler);
       }
       public void onChange(boolean selfChange) {
          //。。。
       }
    }

内容提供者我也没学好,这次的复习也就多写点了
未完待续。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值