ContentProvider与ContentResolver的交互(应用之间的数据交换)(未完)

本文介绍了ContentProvider和ContentResolver在Android应用间数据交换中的作用。通过创建一个ContentProviderModule,分为database和provider两个包,实现数据库的初始化和数据操作。ContentProvider负责提供数据,包括数据库的增删改查方法,以及onCreate()和getType(Uri uri)的重写。同时,文章提到了在AndroidManifest.xml中注册ContentProvider的步骤。接下来的部分将介绍ContentResolver如何根据ContentProvider提供的URI进行数据操作。

整体思路:
ContentProvider和ContentResolver的使用
要使用内容提供者和内容获取者,就必须要有两个应用
1个应用是内容提供者(这里面有数据库,有数据的增删改查的方法,uri,有ContentProvider),另外1个应用是内容接收者(根据内容提供者提供的uri对提供者的数据进行相应的操作,这里有ContentResolver)。


ContentProvider(内容提供者)

首先建立一个Module命名为ContentProviderDemo,在它下面建立两个包,一个是database包,另外一个是provider包。(因为内容提供者没有数据展示,所以没有布局文件)。ContentProvider就是讲自己数据库里的数据提供出去。
1.初始化数据库和数据,并提供增删改查的方法。
在database包下建立一个MyDataBase.java的类并继承SQLiteOpenHelper。增加构造函数并重写初始化数据库和升级数据库的两个方法。代码如下。

public class MyDataBase extends SQLiteOpenHelper {
    //构造函数有四个参数,第一个是上下文,第二个是数据库名,第三个是游标工厂为null就行,第四个是数据库版本,默认为1。前期固定数据库名和版本号。
    private static  final String DBNAME="Students";
    private static  final int VERSION=1;

    public DataBaseOpenHelper(Context context) {
        super(context, DBNAME, null, VERSION);
    }

//在onCreate()方法中初始化数据库、建表和添加初始数据。
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table student(id Integer primary key , name varchar(20),sex varchar(2),age Integer);";
        //执行sql语句建表
        db.execSQL(sql);

        //初始化数据
        sql = "insert into student values(1,'貂蝉','女',20)" ;
        db.execSQL(sql);

        sql = "insert into student values(2,'赵云','男',24)" ;
        db.execSQL(sql);

        sql = "insert into student values(3,'小乔','女',21)" ;
        db.execSQL(sql);
    }

//升级数据库是使用onUpgrade()方法;
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

2.编写一个MyContentProvider的类继承ContentProvider将自己的数据提供出去。
继承ContentProvider后要重写6个方法,除了增删改查四个之外还有onCreate() 和 getType(Uri uri)方法。以下是详细代码。

public class MyContentProvider extends ContentProvider {
    //声明数据库操作对象
    DataBaseOpenHelper helper ;
    //声明Uri匹配对象
    UriMatcher matcher ;
    //声明author认证(钥匙)
    private static final String AUTHORITIES = "com.qianyuaixi.mycontentprovider" ;

    //声明Uri匹配码,由内容获取者传过来的Uri请求经过Uri匹配对象匹配过后获得
    private static final int ALL = 1 ;
    private static final int INSERT = 2 ;
    private static final int DELETE= 3 ;
    private static final int UPDATA = 4 ;

    //重写onCreate()方法,当应用被安装,创建ContentProvider的时候,就会被调用。主要用来初始实例化数据库操作对象、初始非法URI时的返回码和自定义URI匹配对象匹配过后的匹配码。
    @Override
    public boolean onCreate() {
        //实例化helper
        helper = new DataBaseOpenHelper(getContext());
        //参数为传入非法URI时的返回码
        matcher = new UriMatcher(UriMatcher.NO_MATCH);

        //为contentProvider添加可以访问的URI
        /**
         * 第一个参数:认证
         * 第二个参数:路径 path
         * 第三个参数:匹配返回码
         */
       matcher.addURI(AUTHORITIES,"student/all",ALL);
       matcher.addURI(AUTHORITIES,"student/insert",INSERT);
       matcher.addURI(AUTHORITIES,"student/delete",DELETE);
       matcher.addURI(AUTHORITIES,"student/updata",UPDATA);

       return false;
    }


    /**
     *  内容提供者对外所提供的查询功能
     * @param uri   统一资源标识符
     * @param projection 查询的列的名字组成的数组
     * @param selection  查询条件
     * @param selectionArgs 查询条件的参数组成的数组
     * @param sortOrder 排序条件
     * @return
     */
    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        //利用URI匹配对象将传过来的uri匹配出对应的匹配码
        int code = matcher.match(uri);
        //获得数据库操作对象
        SQLiteDatabase db = helper.getReadableDatabase();
        //声明要返回的结果集。
        Cursor c = null;
        switch (code){
            case ALL:
            c = db.query("student",projection,selection,selectionArgs,null,null,sortOrder);
        break ;
        }
        return c;
    }

    //很少使用
    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }


    /**
     * 内容提供者对外所提供的插入数据的功能
     * @param uri  统一资源标识符
     * @param values  插入的数据
     * @return   返回一个统一资源标识符
     */
    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //利用URI匹配对象将传过来的uri匹配出对应的匹配码
        int  code = matcher.match(uri);
        //获得数据库操作对象
        SQLiteDatabase db = helper.getWritableDatabase();
        switch (code){
            case INSERT :
           long rawId = db.insert("student","id",values);
     //将rawId与uri进行拼接形成新的URI,内容获取者可利用此URI获得rawId。
           uri = ContentUris.withAppendedId(uri,rawId);
//                System.out.println("InsertUri-->"+uri);
                break;
        }
        return uri;
    }


    /**
     *  内容提供者对外所提供的删除数据的功能
     * @param uri   统一资源标识符
     * @param selection 删除条件
     * @param selectionArgs 删除条件的参数组成的数组
     * @return
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        //利用URI匹配对象将传过来的uri匹配出对应的匹配码
        int  code = matcher.match(uri);
        //获得数据库操作对象
        SQLiteDatabase db = helper.getWritableDatabase();
        int rawId=0;
        switch (code){
            case DELETE :
            rawId= db.delete("student",selection,selectionArgs);
            break;        
        }
        return rawId;        
    }


    /**
     * 内容提供者对外所提供的修改数据的功能
     * @param uri    统一资源标识符
     * @param values 修改的数据
     * @param selection 修改条件
     * @param selectionArgs 修改条件的参数组成的数组
     * @return
     */
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        //返回的uri是传入的uri+/+db.insert()的返回值
        int  code = matcher.match(uri);
        //获得数据库操作对象
        SQLiteDatabase db = helper.getWritableDatabase();
        int rawId=0;
        switch (code) {
          case UPDATA :
                rawId= db.update("student",values,selection,selectionArgs);
                break;
        }
    }
}

以上就是继承ContentProvider所重写的6个方法

3.在manifest.xml文件中为该ContentProvider进行注册
Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.soft.qianyu.contentproviderdemo">

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" 
android:supportsRtl="true" 
android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

<provider            android:authorities="com.zdsoft.mycontentprovider"          android:name="com.soft.qianyu.contentproviderdemo.provider.MyContentProvider"
android:exported="true"/>

    </application>
</manifest>

主要的代码是在<activity><application>之间插入如下代码。

<provider            android:authorities="com.zdsoft.mycontentprovider"          android:name="com.soft.qianyu.contentproviderdemo.provider.MyContentProvider"
android:exported="true"/>

至此,ContentProvider的类就完成了。接来下编写ContentResolver。


ContentResolver(内容获取者)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值