基础篇:7.Content provider与Content Resolver实现数据共享

前言:

  文件数据、数据库数据以及一些其它类型的数据在android中都是私有的,在android中,并没有提供所有应用共同访问的公共储存区域。但各应用程序间通常需要进行数据共享,如联系人信息等。

  在android中,应用程序可以实现Content Provider的抽象接口从而将自己的数据暴露出去。Content Provider拥有一套通用的方法来实现对数据的增、删、改、查功能。但通常情况下我们都是使用系统内置的Content Provider,自己实现并不常见。

  当数据在一个应用程序中被暴露出来后,外界可以通过Content Resolver提供的一套标准方法对数据进行增、删、改、查操作。

Content Provider类:

  1.Content Provider为储存数据提供了统一的接口,利用表的形式进行数据储存:

  2.android为常见的一些数据提供了默认的Content Provider,如声音、视频、图像等。

Content Resolver类:

  外界程序通过实现Content Resolver的接口可以访问Content Provider提供的数据。在Activity中,可以通过getContentResolver()获得当前应用的Content Resolver实例。Content Resolver的一些常用接口如下:

  增:inser(Uri uri,ContentValues values) ---将数据插入到uri所指定的位置;

  删:delete(Uri uri,String where,String[] selectionArgs)---删除指定uri并符合指定条件的数据;

  改:update(Uri uri,ContentValues values,String where,String[] selectionArgs)---更改uri指定并符合指定条件的数据;

  查:query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)---查询uri指定并符合指定条件的数据,并返回Cursor对象。其中第二个参数为:应返回的列名称;第三个参数为:哪些行被返回的过滤器。

private String getdata() {
        // TODO Auto-generated method stub
        StringBuilder sb=new StringBuilder();//StringBuilder一个可变的字符序列
        ContentResolver resolver=getContentResolver();//获得ContentResolver对象
        Cursor cursor=resolver.query(Contacts.CONTENT_URI, null, null, null, null);//调用query进行查询
        int inIndex=cursor.getColumnIndex(columns[0]);//获得ID纪录的列索引
        int nameIndex=cursor.getColumnIndex(columns[1]);
        while(cursor.moveToNext()){
            int id=cursor.getInt(inIndex);//取得id
            String name=cursor.getString(nameIndex);
            Cursor phone=resolver.query(Phone.CONTENT_URI, null, columns[3]+"="+id, null, null);//查询数据
            while(phone.moveToNext()){
                int phoneIndex=phone.getColumnIndex(columns[2]);
                String phoneNumber=phone.getString(phoneIndex);
                sb.append(id+":"+name+phoneNumber+"
");//将字符添加到生成器(StringBuilder)
            }        
        }
        cursor.close();
        return sb.toString();
    }

URI:

  URI---统一资源标识符:为系统的每个资源配一个名字如联系人、通话记录、未接来电等。

  每个Content Provider都拥有一个公共的URI,用于表示这个URI所提供的数据,标识着Content Resolver应该使用哪个provider以及其中的哪些表格。

  A:标准前缀:不用修改。

  B:URI标识:定义了是由哪个provider提供的数据。对于第三方应用,这部分应该是完整的类名(小写)。

  C:路径:指定被请求的数据类型,如若只有一种数据类型,也可以不指定该部分。

  D:特定记录的ID值,增加这部分,可以返回ID所指定的数据,否则返回全部。

  根据我自己的理解,将Content Provider与Content Resolver之间的关系绘制如下图:

原文地址:https://www.cnblogs.com/dream550/p/3906447.html