Android ContentProvider的使用和理解

ContentProvider是Android中跨进程数据交换的重要类,Android为数据交换提供了一个标准ContentProvider.

那么应该如何完整实现开发一个contentProvider呢
1、首先需要定义自己的ContentProvider,该类需要继承Android提供的ContentProvider的基类
2、需要在AndroidManifest.xml文件中注册这个ContentProvider

1、子类

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

public class DictProvider extends ContentProvider {

    String TAG  = "=======TAG=====" ;
    @Override
    public boolean onCreate() {
        Log.v(TAG,"onCreate");
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        Log.v(TAG,"query");
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        Log.v(TAG,"getType");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        Log.v(TAG,"insert");
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        Log.v(TAG,"delete");
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        Log.v(TAG,"update");
        return 0;
    }
}

2、注册

<provider
            android:authorities="com.jewelermobile.gangfu.zdydemo1.DictProvider"
            android:name=".activity.DictProvider"
            android:exported="true"/>// true 允许外部应用启动 反之 不能启动

3、如何配置一个Uri,Uri扮演什么样的角色。

Content://com.jewelermobile.gangfu.zdydemo1.DictProvider/资源部分

(1)Content:// 这部分是Android的ContentProvider规定,并且固定
(2)com.jewelermobile.gangfu.zdydemo1.DictProvider 这部分是注册时的android:authorities,注册之后并且固定
(3)资源部分,这个根据查询资源改变所以不固定

Uri其实就是一个地址,只有通过Uri才能对应去操作ContentProvider,就像一条唯一通往胜利道路。

4、怎么从外部应用调用操作此ContentProvider?

Android提供了ContentResolver去操作ContentProvider
final ContentResolver p = this.getContentResolver();

    Uri uri = Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/");
    private void initContentProvider() {
        final ContentResolver p = this.getContentResolver();
        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                p.insert(uri,new ContentValues());
            }
        });

        findViewById(R.id.del).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                p.delete(uri,"",new String[]{});
            }
        });

        findViewById(R.id.update).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                p.update(uri,null,null,new String[]{});
            }
        });

        findViewById(R.id.qur).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                p.query(uri,null,null,null,null);
            }
        });
    }

运行结果测试

在这里插入图片描述
通过测试可以知道每次创建时回调Oncreate方法

public String getType(@NonNull Uri uri)方法的作用,代表当前返回数据MIME类型,如果包含多条记录,那么MIME类型字符串以vnd.android.cursor.dir/开头,如果只有一条记录那么MIME类型字符串以vnd.android.cursor.item/开头。

5、android提供UriMatcher 和 ContentUris工具类操作Uri

(1)、UriMatcher
1、void addUri(String authority,String path,int code) 该方法参数authority和path组成一个Uri,code为当前Uri的标识码
2、int match(Uri uri) 通过注册的Uri获取标识码

 UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
 //注册Uri
 uriMatcher.addURI("com.jewelermobile.gangfu.zdydemo1.DictProvider","path",1);
 
 //获取注册的Uri标识码   结果为1 
  uriMatcher.match(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path"));

(2)、ContentUris
1、WithAppendedId(Uri uri,int id) 用于为路径加Id


 ContentUris.withAppendedId(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path"),1);
 //添加id之后
 content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path/1

2、parseId(Uri uri) 用于指定的Uri中解析出Id

ContentUris.parseId(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path/1"));
//解析出来的Id为 1 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

将哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值