«

ContentProvider的感想

时间:2024-3-2 17:20     作者:韩俊     分类: PHP


今天,接触到了ContentProvider,它作为Android的四大组件之一,有着它不可替代的作用。它就像经销商一样经营着手机中每个App的Sqlite数据库,可以让每个App互相获取其他App的数据,在一个App中要想注册一个ContentProvider,必须有一个类继承ContentProvider,并且实现当中的onCreate(),getType(),update(),delete(),query(),insert(),方法,该类所实现的方法能够非常好的实现对Sqlite数据库的增删改查,通知也必须要在AndroidManifast.xml也就是清单文件中注册provider,例如:

<provider
            android:name="com.example.provider.DBProvider"
            android:authorities="com.example.provider.DBProvider"
            android:exported="true" >
        </provider>

其中name标签指的是该组件的位置(通常是包名加类名),而authorities则代表着访问该数据库的Uri,而exported属性标签则代表是否暴露出去。

在ContentProvider的子类中的Oncreate()方法我们需要获取一个Sqlite数据库的连接,同时也需要在子类当中编写一个代码块,其作用是编写为ContentProvider添加匹配Uri

例如:

   private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
    private static final String AUTHORITY = "com.example.day17demo01provider.db.StuProvider";
    private SQLiteDatabase db;
    //添加匹配项
    static{
//      content://sms--->定位到短信数据所有
        //content://联系人/90---》某一条数据
        //url  协议:http    host:www.baidu.com    path:/img
        //uri  协议:content://   域名:AUTHORITY域名     path:/表名

        //添加要哦匹配的URI。---》参数1:authority   参数2:资源路径:表名      参数3:该uri匹配成功的返回码code
        //完整路径Uri:content://com.example.day17demo01provider.db.StuProvider/javaScore
        matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME, 1);

        //模糊匹配:id--->#数值
        matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/#", 2);

        //模糊匹配:name---》*文本
        matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/*", 3);       

//      matcher.match(uri)
    }

    //实例化ContentProvider的时候调用---》不要做耗时操作
    @Override
    public boolean onCreate() {
        db=new DBHelper(getContext()).getWritableDatabase();
        return false;
    }
其中“/#”代表通过数字也就是Id匹配,“/*”代表通过字符串匹配,然后是getType()方法,它的作用是通过你所匹配的Uri获取数据的条数来返回字符串

比如当你通过Id来匹配Uri时,你只能获取一条数据那么getType方法就会返回type="vnd.android.cursor.item/vnd."+Uri+"."+表名;

当你通过完整的路劲查询或者是其他属性来查询是,您能获取多条数据那么getType方法会返回type="vnd.android.cursor.dir/vnd."+Uri+"."+表名;

然后是查询方法query,其中参数Uri代表访问的uri,projection代表要查询的列,参数selection代表查询条件,selectionArgs代表查询条件中占位符的值,

sortOrder代表排序

@Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
在query方法中,我们首先通过UriMatcher对象调用match方法来匹配Uri,从而判断是通过什么来查询

例如:

//把传进来的uri进行匹配---》定位一条数据还是多条数据
        int code = matcher.match(uri);

        Cursor cursor = null;

        switch (code) {
        case 1://全部
            cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
            break;
        case 2://指定id
            //取出uri中的id
            long id = ContentUris.parseId(uri);

            cursor = db.query(DBHelper.TABLE_NAME, projection, DBHelper.JAVA_ID+" = ?", new String[]{id+""}, null, null, sortOrder);
            break;
        case 3://指定name
            //取出name值
            String name=uri.getLastPathSegment();
            //查找条件---》name的值--》模糊匹配
            cursor=db.query(DBHelper.TABLE_NAME, projection, " name like '%"+name+"%'", null, null, null, sortOrder);

            break;
        default:
            break;
        }
        return cursor;
同时delete和update方法也是同query方法一样首先判断匹配uri,然后通过code来进行操作,这里就不一一讲述了

下面就是insert方法了

首先先来段代码

   //插入数据
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int code = matcher.match(uri);
        Uri withAppendedId =null;
        if(code==1){
            long id = db.insert(DBHelper.TABLE_NAME, null, values);

            withAppendedId = ContentUris.withAppendedId(uri, id);
        }
        return withAppendedId;
    }
这就是ContentProvider的相关代码了,下面是完整代码:
package com.example.day17demo01provider.db;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class StuProvider extends ContentProvider{
    private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
    private static final String AUTHORITY = "com.example.day17demo01provider.db.StuProvider";
    private SQLiteDatabase db;
    //添加匹配项
    static{
//      content://sms--->定位到短信数据所有
        //content://联系人/90---》某一条数据
        //url  协议:http    host:www.baidu.com    path:/img
        //uri  协议:content://   域名:AUTHORITY域名     path:/表名

        //添加要哦匹配的URI。---》参数1:authority   参数2:资源路径:表名      参数3:该uri匹配成功的返回码code
        //完整路径Uri:content://com.example.day17demo01provider.db.StuProvider/javaScore
        matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME, 1);

        //模糊匹配:id--->#数值
        matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/#", 2);

        //模糊匹配:name---》*文本
        matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/*", 3);       

//      matcher.match(uri)
    }

    //实例化ContentProvider的时候调用---》不要做耗时操作
    @Override
    public boolean onCreate() {
        db=new DBHelper(getContext()).getWritableDatabase();
        return false;
    }

    //查找数据--->查找SQLite---》SQLiteDataBase
    //参数1:uri    参数2:要查找的列    参数4:查找条件     参数5:条件中占位符的值   参数6:排序
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        //把传进来的uri进行匹配---》定位一条数据还是多条数据
        int code = matcher.match(uri);

        Cursor cursor = null;

        switch (code) {
        case 1://全部
            cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
            break;
        case 2://指定id
            //取出uri中的id
            long id = ContentUris.parseId(uri);

            cursor = db.query(DBHelper.TABLE_NAME, projection, DBHelper.JAVA_ID+" = ?", new String[]{id+""}, null, null, sortOrder);
            break;
        case 3://指定name
            //取出name值
            String name=uri.getLastPathSegment();
            //查找条件---》name的值--》模糊匹配
            cursor=db.query(DBHelper.TABLE_NAME, projection, " name like '%"+name+"%'", null, null, null, sortOrder);

            break;
        default:
            break;
        }
        return cursor;
    }
    //获取类型--->name、没有值匹配---》1、3---》多条数据
    //2:单条数据
    @Override
    public String getType(Uri uri) {
        String type=null;

        int code = matcher.match(uri);
        switch (code) {
        case 1://多条数据
        case 3:
            type="vnd.android.cursor.dir/vnd."+AUTHORITY+"."+DBHelper.TABLE_NAME;
            break;      
        case 2:
            type="vnd.android.cursor.item/vnd."+AUTHORITY+"."+DBHelper.TABLE_NAME;
            break;
        default:
            break;
        }

        return type;
    }
    //插入数据
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int code = matcher.match(uri);
        Uri withAppendedId =null;
        if(code==1){
            long id = db.insert(DBHelper.TABLE_NAME, null, values);

            withAppendedId = ContentUris.withAppendedId(uri, id);
        }
        return withAppendedId;
    }
    //删除
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int rawNum =0;

        int code = matcher.match(uri);

        if(code==2){//包含有数值--》id
            long id = ContentUris.parseId(uri);//删除条件

            //数据库的删除操作
            rawNum = db.delete(DBHelper.TABLE_NAME, DBHelper.JAVA_ID+" = ?", new String[]{id+""});
        }

        return rawNum;
    }
    //更新
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {

        int code = matcher.match(uri);
        switch (code) {
        case 1://没有指定name、id
            db.update(DBHelper.TABLE_NAME, values, selection, selectionArgs);
            break;
        case 2://id
            //取出id
            long id = ContentUris.parseId(uri);

            //根据id去更新数
            db.update(DBHelper.TABLE_NAME, values, DBHelper.JAVA_ID+" = ?", new String[]{id+""});
            break;
        case 3://name
            //取出name
            String name = uri.getLastPathSegment();
            //根据name去更新
            db.update(DBHelper.TABLE_NAME, values, DBHelper.JAVA_NAME+" like '%"+name+"%'", null);

            break;
        default:
            break;
        }

        return 0;
    }
}

谢谢大家,请大家多多支持



标签: php php教程

热门推荐