Android开发——ContentProvider

ContentProvider能够实现不同应用程序之间的数据共享

1.需要用到的帮助类

1)Uri

URI(统一资源标识符)代表要操作的数据,可以用来标识每个ContentProvider,这样你就可以通过指定的URI找到想要的ContentProvider,从中获取或修改数据。由URI来决定操作对哪个数据源进行!! 

  • A:schema,已经由Android所规定为:content://
  • B:主机名(Authority),是URI的授权部分,是唯一标识符,用来定位ContentProvider。
  • C:指向一个对象集合,一般用表的名字,如果没有指定D部分,则返回全部记录。
  • D:指向特定的记录,这里表示操作user表id为7的记录。如果要操作user表中id为7的记录的name字段, D部分变为 /7/name即可。

2.)UriMatcher类使用介绍

UriMatcher类用于匹配Uri

a)addURI

//   content://主机名/对象集合名/id
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "insert", INSERTSUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "delete", DELETESUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "updata", UPDATASUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "query", QUERYSUCCESS);
//添加需要匹配的URI,如果匹配成功则返回第三个参数,例如INSERTSUCCESS

b)match

//用于匹配uri,返回uri的匹配值
QUERYSUCCESS == uriMatcher.match(uri)

2. ContentProvider

1)数据源端

a)定义路径匹配器,并添加URI

    //定义路径匹配器!(匹配不成功时,返回一个NO_MATCH,值为-1)
    private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int INSERTSUCCESS = 0;//对该数据库 插入匹配成功时的返回值
    private static final int DELETESUCCESS = 1;//对该数据库 删除匹配成功时的返回值
    private static final int UPDATASUCCESS = 2;//对该数据库 修改匹配成功时的返回值
    private static final int QUERYSUCCESS = 3;//对该数据库 查询匹配成功时的返回值
    //创建一个静态代码块,用于添加URI
    static {//该代码块在加载类时只执行一次!!!
        //   content://主机名/对象集合名/id
        uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "insert", INSERTSUCCESS);
        uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "delete", DELETESUCCESS);
        uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "updata", UPDATASUCCESS);
        uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "query", QUERYSUCCESS);
    }

b)重写增删改查函数

    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        if (QUERYSUCCESS == uriMatcher.match(uri)) {//这些操作对谁执行是由URI决定的!!!!
            //打开数据库
            MyDBOpenHelper myDBOpenHelper = new MyDBOpenHelper(getContext(), "Staff.db", null, 1);
            SQLiteDatabase db = myDBOpenHelper.getReadableDatabase();
            Cursor cursor = db.query("Staffinfo", strings, s, strings1, null, null, s1, null);
            //db.close(); 这里注意!!关闭数据库会报错!!!运行异常
            return cursor;
        }
        return null;
    }

逻辑思想:通过调用端传来的URI来确定这些“操作”是对哪个数据源进行的!! 

c)在manifest清单文件中声明

        <provider
            android:authorities="com.example.practice7sqliteandprovider.StaffProvider"
            android:name=".StaffProvider"
            android:exported="true">

        </provider>

注意主机名的定义,通过用"包名+类名"

exported要设为true,允许其他应用程序访问 

2)调用端

通过Resolver对象来对数据源进行增删改查操作

        //添加点击事件
        query.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("Range")
            @Override
            public void onClick(View view) {
                //通过uri找到目标数据源的Provider!!
                Uri uri = Uri.parse("content://com.example.practice7sqliteandprovider.StaffProvider/query");
                //调用Resolver的查询接口进行查询,通过uri来将查询操作定位到某个数据源
                Cursor cursor = getContentResolver().query(uri, new String[]{"_id","name","sex","department","salary"}, null, null, null);
                //遍历输出数据
                String message = "数据库:\n";
                while (cursor.moveToNext()){
                    message += "ID:"+cursor.getInt(cursor.getColumnIndex("_id"))+"; ";
                    message += "姓名:"+cursor.getInt(cursor.getColumnIndex("name"))+"; ";
                    message += "性别:"+cursor.getInt(cursor.getColumnIndex("sex"))+"; ";
                    message += "部门:"+cursor.getInt(cursor.getColumnIndex("department"))+"; ";
                    message += "工资:"+cursor.getInt(cursor.getColumnIndex("salary"))+";\n";
                }
                show.setText(message);
                Toast.makeText(MainActivity.this, "查询成功!!", Toast.LENGTH_SHORT).show();
            }
        });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值